TCP/IP上三层的角色
同一台设备上的进程间通信有多种方式,如管道、消息队列、共享内存、信号等。而不同设备间的进程通信需要网络通信,由于设备具有多样性,因此协商出了一套通用的网络协议。这个网络协议是分层的,每一层都有各自的作用和职责,接下来将依据 “TCP/IP 网络模型” 对每一层进行介绍。
应用层(对接程序)
是最上层的协议,用户能够直接接触到的就是应用层,我们手机的软件等等都是在这一层实现的,需要通信时把数据传给下一层传输层,所以本层主要针对为用户提供应用的功能,而不关心数据在互联网之中是如何传输的。
应用层主要工作在操作系统中的用户态,而传输层以及一下在内核态工作。
传输层(为应用层提供网络支持)
传输层有两种传输协议:TCP 和 UDP。
TCP,即传输控制协议 (Transmission Control Protocol),很多应用都采用 TCP 作为传输层协议,比如 HTTP 应用层协议。TCP 比 UDP 具备更多功能,包括流量控制、超时重传和拥塞控制等,这些功能保障了数据包能够可靠地传递到对方。
UDP 较为简单,它只负责发送数据包,不确保数据包能到达接收方。不过,UDP 的实时性和传输效率比较高。虽然 UDP 也可以实现可靠传输,但需要在应用层上实现类似 TCP 的特性,而开发一个商业可用的可靠 UDP 传输协议并不容易。
当应用程序需要传输的数据量很大时,直接传输难以管控。当传输层的数据包大小超过 MSS(TCP 最大报文段长度)时,数据包需要进行分块。这样,如果在传输过程中有一个分块丢失或损坏,只需要重新发送该分块,而不必重发整个数据包。在 TCP 协议中,这些分块被称为 TCP 段 (TCP Segment)。
当设备作为接收方时,传输层需要把数据包传递给相应的应用。但一台设备上可能有多个应用在接收或传输数据,所以需要用一个编号来区分不同的应用,这个编号就是端口。
例如,80 端口通常用于 Web 服务器,22 端口通常用于远程登录服务器。对于浏览器(客户端)中的每个标签页,它们都是独立的进程,操作系统会为这些进程分配临时的端口号。
因为传输层的报文中会包含端口号,所以接收方能够识别出该报文是发送给哪个应用的。
网络层
刚接触传输层时,人们可能会以为它负责将数据从一个设备传输到另一个设备,但实际上并非如此。在实际的网络环境中,网络环节错综复杂,存在着各种各样的线路和分叉路口,若要将一个设备的数据传输给另一个设备,就需要在众多路径和节点中进行选择。而传输层的设计理念是简单、高效和专注,若让传输层负责这一功能,就违背了其设计原则。
也就是说,我们不希望传输层协议处理过多事务,它只需服务好应用,作为应用间数据传输的媒介,实现应用到应用的通信即可,实际的传输功能应由下一层 —— 网络层来负责。
网络层最常使用的是IP 协议(interet Protocol),IP协议会将传输层的报文作为数据部分,再加上IP 包头组装成 IP 报文,如果 IP 报文大小超过 MTU(以太网中一般为 1500 字节)就会再次进行分片,得到一个即将发送到网络的IP 报文。
首先,网络层的主要功能是将数据从一个设备传输到另一个设备。在庞大的网络环境中,设备众多,因此需要通过 IP 地址来区分和标识设备。
对于 IPv4 协议,IP 地址由 32 位组成,分成四段(例如 192.168.100.1),每段 8 位。单一的 IP 地址虽然可以标识设备,但在查找设备时效率很低,因此 IP 地址被分成两种意义:网络号和主机号。
- 网络号:标识 IP 地址属于哪个子网。
- 主机号:标识同一子网下的不同主机。
子网掩码用于区分 IP 地址中的网络号和主机号。例如,子网掩码 255.255.255.0 与 IP 地址 10.100.122.2 进行按位与运算,可以得到网络号 10.100.122.0,路由器根据 IP 址的网络号进行转发,帮助数据包找到目标地址的子网,并将数据包转发到相应的网络内。
网络接口层(Link Layer)在 IP 头部的前面加上 MAC 头部,并封装成数据帧(Data frame)发送到网络上。
引用 ~~小林coding