TCP/IP五层模型
物理层:负责光/电信号的传递方式. 比如现在以太网通用的网线(双绞线)、早期以太网采用的的同轴电缆(现在主要用于有线电视)、光纤,现在的 WIFI无线网使用电磁波等都属于物理层的概念。物理层的能力决定了最大传输速率、传输距离、抗干扰性等。集线器(Hub)工作在物理层,它通过物理层的广播方式来转发数据包。当一个计算机需要向另一个计算机发送数据时,它会将数据包发送给集线器,集线器会将这个数据包广播到所有连接到它的端口上。这样,所有连接到集线器上的计算机都能够收到这个数据包,并根据目标MAC 地址来判断是否接收该数据包。
数据链路层:负责设备之间的数据帧的传送和识别。例如网卡设备的驱动、帧同步(就是说从网线上检测到什么信号算作新帧的开始)、冲突检测(如果检测到冲突就自动发)、数据差错校验等工作,有以太网、令牌环网,无线LAN等标准。交换机(Switch)工作在数据链路层,它能够分析数据包的 MAC 地址,并根据 MAC 地址来确定数据包应该发送到哪个端口。当一个计算机需要向另一个计算机发送数据时,它会将数据包发送给交换机,交换机会根据目标 MAC地址来确定该数据包应该发送到哪个端口。这样,只有目标计算机会接收到这个数据包,而其他计算机则不会收到。
网络层:负责地址管理和路由选择,例如在 IP 协议中,通过 IP地址来标识一台主机,并通过路由表的方式规划出两台主机之间的数据传输的线路(路由),路由器(Router)工作在网路层,它能够分析数据包的 IP 地址,并根据 IP 地址来确定数据包应该转发到哪个网络中。当一个计算机需要向另一个网络中的计算机发送数据时,它会将数据包发送给路由器,路由器会根据目标IP地址来确定该数据包应该转发到哪个网络中。这样,不同网络之间的计算机就能够相互通信了。
传输层:负责两台主机之间的数据传输,如传输控制协议 (TCP)能够确保数据可靠的从源主机发送到目标主机。
应用层:负责应用程序间沟通,如简单电子邮件传输(SMTP)、文件传输协议(FTP)、网络远程访问协议(Telnet)等,我们的网络编程主要就是针对应用层。
通信过程简述
从上到下将数据封装,即每一层添加每一层对应的报头,通过以太网传播给对应的目标,然后自下而上进行解包过程即去掉每一层的报头,最后得到有效载荷实现通信。
报文=报头+有效载荷
每层协议都要提供分离报头和有效载荷的能力,都要提供决定将有效载荷交付给上层哪个协议的能力。
以太网(局域网)通信
局域网中每台主机都有一个惟一的mac地址。
1.帧的生成:当一台计算机要向另一台计算机发送数据时,它会将数据封装成一个数据帧,包括目标地址、源地址、数据内容等信息。
2.帧的传输:生成的数据帧会通过计算机的网卡发送到以太网上,然后通过以太网的传输介质传输到目标计算机。
3.帧的接收:当目标计算机接收到数据帧时,它会检查帧的目标地址是否与自己的地址匹配,如果匹配,则接收数据帧并将其解封装,提取出数据内容。
4.冲突检测与重传:在以太网上,多台计算机可以同时发送数据帧,这可能会导致帧的冲突。因此,以太网采用了冲突检测机制,当检测到冲突时,发送的计算机会停止发送数据,并在一段时间后重新发送。如果发送的数据帧没有被接收到,发送的计算机还会进行重传,直到数据帧被成功接收。
5.为了解决数据碰撞的问题,以太网采用了 CSMA / CD 协议。CSMA / CD 协议意味着 “带冲突检测的载波侦听多路访问”,它规定了当主机要发送数据时,需要先侦听介质上是否有其他主机正在发送数据。如果介质上有信号,主机就会等待一段随机时间后再发送数据。如果多个主机同时发送数据,会发生碰撞,这时所有的主机都会检测到冲突,并停止发送数据。接着,每个主机会等待一段随机时间后再次尝试发送数据,直到成功为止。
除了 CSMA / CD 协议,局域网还可以采用其他方法来解决数据碰撞问题,如使用交换机或使用全双工通信等技术。
mac地址和ip地址区别
1.mac地址是在硬件出厂时确定,是唯一的,作用在数据链路层,长度为48位。
2.而ip地址是逻辑地址,基于网络拓扑分配,不是惟一的,作用在网络层,ipv4 32位,ipv6 128位。
端口号
端口号是传输层协议的内容,它是用于标识网络应用程序的通信端口的一个 16 位的数字,其取值范围是 0 到 65535。其中 0 到 1023 的端口号被保留用于一些特定的服务和应用程序,称为“系统端口”或“熟知端口”,例如 HTTP 服务使用的端口号为 80,SMTP 服务使用的端口号为 25。每个端口号都与一个特定的应用程序或服务相关联,用于区分同一主机上的不同应用程序或在网络上的不同主机上的不同应用程序。
在一个网络数据包中,源和目标主机的 IP 地址用于标识主机在网络中的位置,而源和目标端口号则用于标识主机上的应用程序(进程)。网络应用程序使用端口号来与其他应用程序进行通信。在网络传输中,源主机上的应用程序将数据发送到目标主机上的特定端口号,目标主机会将数据包路由到相应的应用程序上进行处理。因此,端口号的作用是为应用程序提供一种可靠的通信机制,使不同的应用程序可以在同一主机上共存,或者在不同主机上进行通信。
注:IP地址 + 端口号能够标识网络上的某一台主机的某一个进程,一个端口号只能被一个进程占用,而一个进程可以绑定多个端口号。
端口号和进程pid
pid已经能表示一台主机上进程的唯一性,为何还要端口号?
1.系统和网络功能解耦。将操作系统进程管理层面的pid和网络通信的端口号解耦。
2.如果一个进程想要提供多个服务或连接到多个不同的网络服务,它可能需要使用多个端口号。此外,不同的进程也可以复用相同的端口号。
3.PID是操作系统特定的,不同的操作系统或不同的系统实例可能会有相同的PID。而端口号是在网络层使用的,它允许跨平台、跨网络的进程间通信。这意味着,无论进程运行在哪个操作系统或哪个网络设备上,只要它们使用相同的端口号,就可以进行通信。
4.不是所有进程都要网络通信,但所有进程都要有pid。
网络字节序
网络字节序(Network Byte Order)是一种统一的字节序,用于在计算机网络中进行数据传输。由于不同的计算机可能使用不同的字节序(大小端),因此在网络传输中,需要使用一种固定的字节序来确保数据的正确传输和解析。
网络字节序采用的是大端字节序(Big-endian):将高位字节存放在内存的低地址处,低位字节存放在内存的高地址处。在网络字节序中,所有数据类型(如整型、浮点型、字符型等)都采用相同的字节序,这样就可以保证在不同的计算机上进行数据传输和解析时,不会出现字节序不一致的问题。
套接字编程
sockaddr 是一个通用的套接字地址结构体,它包含了地址族、地址信息等字段。在 socket 编程中,通常需要将sockaddr 类型的地址转换成对应的具体类型的地址结构体,例如 sockaddr_in 或 sockaddr_un,才能方便地进行相关的操作。sockaddr 的结构体定义如下:
struct sockaddr
{
sa_family_t sa_family; //地址族(AF_xxx)
char sa_data[14]; //14字节协议特定地址信息
};
sa_family 表示地址族,具体取值可以是 AF_UNIX、AF_INET、AF_INET6 等,sa_data 字段是协议特定的地址信息。在实际使用中,sockaddr 通常会被转换为其他具体的地址结构体,例如 sockaddr_in 或 sockaddr_un。
sockaddr_in 是 Internet 域套接字地址结构体,它在sockaddr 的基础上增加了 IPv4 地址和端口号字段。sockaddr_in 的结构体定义如下:
struct sockaddr_in
{
sa_family_t sin_family; //地址族(AF_INET)
uint16_t sin_port; //16位端口号
struct in_addr sin_addr; //32位IPv4地址
char sin_zero[8]; //不使用的填充字段
};
sockaddr_un 是 Unix 域套接字地址结构体,它在sockaddr 的基础上增加了一个路径名字段。sockaddr_un的结构体定义如下:
struct sockaddr_un
{
sa_family_t sun_family; //地址族(AF_UNIX)
char sun_path[108]; //文件路径名
};