之前写过一篇《通俗易懂TCP/IP(概述)》,广受欢迎和好评,有网友催更,便抽空续写IP章节,回应粉丝期待。
TCP/IP网络模型TCP/IP网络模型分为4层,自下而上分布为链路层(又叫网络接口层)、网络层、传输层、应用层。
- 链路层:处理数据在媒介上的表示、传输以及与硬件交互的细节。
- 网络层:IP层负责IP数据报的路由转发,所有的TCP、UDP、ICMP和IGMP数据都通过IP数据报传输。网络层(IP)提供了一种尽力而为、无连接、不可靠的数据报交付服务,IP负责将IP数据报(又叫分组)放入数据链路层传输,并处理分片和*逻辑。
- 传输层:为端主机上运行的应用程序提供端到端服务,包括TCP和UDP。
- TCP提供了带流量控制、拥塞控制、有序、可靠的流交付,TCP需要处理丢包检测重传、重排序等IP层不处理的问题,TCP面向连接,不保留消息边界。
- UDP提供的功能基本上没有超越IP,不提供速率控制和差错控制,不保证可靠性,UDP只是提供一套端口号,用于复用、多路分解(即把收到的数据报交给应用层对应程序处理)和校验数据完整性(只检错不纠错),UDP面向非连接,保留消息边界。
- 应用层:负责处理特定应用的细节,通常应用的实现都是基于TCP/IP或者UDP/IP。应用层与应用细节相关,与网络数据传输无关,而之下的三层(链路层、网络层、传输层)则对应用一无所知,但需要处理通信的细节。
OSI七层网络模型和TCP/IP四层网络模型的对应关系如下图,对应层的常用协议也列于表中。
分层的目标是隔离,通过分层实现:下层对上层透明,而上层利用下层提供的能力。
分层的另一个优点是协议复用,这种复用允许多种协议共存于同一基础设施之中,复用可以发生在不同层,并在每层都有不同类型的标识符区分,用于确定信息属于哪个协议。
比如在链路层的数据帧(Frame)有一个协议标识符字段,用来标识链路层帧携带的协议是IP还是ARP;又比如在网络层的IP数据报头部有一个8位协议字段,标识该IP数据报来自于TCP、还是UDP、亦或是ICMP、IGMP...
封装数据在发送端从上到下经过TCP/IP协议栈,遵循应用层->TCP/UDP->IP->链路层的顺序。
当某层的一个协议数据单元(PDU)对象转换为由底层携带的数据格式表示,这个过程称为在相邻低层的封装,即上层被封装对象作为不透明数据充当底层的Payload部分,封装是层层包裹的过程。
每层都有自己的消息对象(PDU)的概念。
- TCP层的PDU叫TCP段(segment)
- UDP层的PDU叫UDP数据报(Datagram)
- IP层的PDU叫IP数据报(Datagram)
- 链路层的PDU叫链路层帧(Frame)
封装的本质是将来自上层的数据看成不透明、无须解释的信息,经过本层的处理,在上层PDU的前面加上本层协议的头部,有些协议是增加尾部(链路层),头部用于在发送时复用数据,接收方基于各层封装过程中增加头部中的分解标识符执行分解。
具体到TCP传输数据而言,发送端的数据要经过三次封装。
- 应用层数据经过TCP层的时候,会增加TCP头部,产生TCP Segment,TCP头部中的端口号是该层的分解标识符。
- TCP Segment经过IP层的时候,会增加IP头部,产生IP Datagram,IP头部中的协议类型字段是该层的分解标识符。
- IP分组经过链路层的时候,会增加以太网首部和尾部,产生以太网Frame,帧头部中的以太网类型字段,可用于区分IPv4(0x8000)、IPv6(0x86DD)和ARP(0x0806)。
数据到达接收端(是目的机器),会从下到上经过TCP/IP协议栈,遵循链路层->IP->TCP/UDP->应用层的顺序。
接收端的数据还原也需要经历三次解封。
- 经过链路层会剥离以太网首尾部,根据以太网类型字段,如果是IP Datagram则交给IP模块。
- 经过IP层会清除IP头部,根据IP头部中的协议类型字段,交给TCP、UDP或者ICMP、IGMP模块。
- 经过TCP/UDP层去掉TCP/UDP头部,根据端口号,最终将数据还原取出,并交付给应用程序。