一个应用在主机之间进行通讯的总体过程如上图。这里以TCP/IP四层协议栈为例,说明数据是怎么被主机发送,又怎么被应用接收的。总体过程:在产生应用数据之后,按照从上层到下层的网络协议栈对数据进行封装,封装完成后发出主机,通过网络抵达目的主机,目的主机按照协议栈从下到上对数据进行解封装,直到得到最后源主机封装的应用数据。
封装
按照TCP/IP的四层协议,上层协议能够使用下层协议提供的服务。每一层协议都在上一层协议的基础上加上自己的头部信息,以实现自己的功能,这个过程就叫封装。
传输层封装
传输层主要包括TCP和UDP协议,应用层传过来的数据加上TCP/UDP的头部信息得到实现自己功能的报文,例如TCP要实现可靠传输就要添加ACK、SYN、序号、校验和等信息,UDP不需要实现可靠传输只附加报文长度、校验和等信息。具体的TCP、UDP头部如下:
- 源端口号:发送方端口号
- 目的端口号:接收方端口号
- 序列号:本报文段的数据的第一个字节的序号
- 确认序号:期望收到对方下一个报文段的第一个数据字节的序号
- 首部长度(数据偏移):TCP 报文段的数据起始处距离 TCP 报文段的起始处有多远,即首部长
度。单位:32位,即以 4 字节为计算单位 - 保留:占 6 位,保留为今后使用,目前应置为 0
- 紧急 URG :此位置 1 ,表明紧急指针字段有效,它告诉系统此报文段中有紧急数据,应尽快传送
- 确认 ACK:仅当 ACK=1 时确认号字段才有效,TCP 规定,在连接建立后所有传达的报文段都必须
把 ACK 置1 - 推送 PSH:当两个应用进程进行交互式的通信时,有时在一端的应用进程希望在键入一个命令后立即就能够收到对方的响应。在这种情况下,TCP 就可以使用推送(push)操作,这时,发送方TCP 把 PSH 置 1,并立即创建一个报文段发送出去,接收方收到 PSH = 1 的报文段,就尽快地
(即“推送”向前)交付给接收应用进程,而不再等到整个缓存都填满后再向上交付 - 复位 RST:用于复位相应的 TCP 连接
- 同步 SYN:仅在三次握手建立 TCP 连接时有效。当 SYN = 1 而 ACK = 0 时,表明这是一个连接请
求报文段,对方若同意建立连接,则应在相应的报文段中使用 SYN = 1 和 ACK = 1。因此,SYN 置 1 就表示这是一个连接请求或连接接受报文 - 终止 FIN:用来释放一个连接。当 FIN = 1 时,表明此报文段的发送方的数据已经发送完毕,并要
求释放运输连接 - 窗口:指发送本报文段的一方的接收窗口(而不是自己的发送窗口)
- 校验和:校验和字段检验的范围包括首部和数据两部分,在计算校验和时需要加上 12 字节的伪头
部 - 紧急指针:仅在 URG = 1 时才有意义,它指出本报文段中的紧急数据的字节数(紧急数据结束后就
是普通数据),即指出了紧急数据的末尾在报文中的位置,注意:即使窗口为零时也可发送紧急数 据 - 选项:长度可变,最长可达 40 字节,当没有使用选项时,TCP 首部长度是 20 字节
- 源端口号:发送方端口号
- 目的端口号:接收方端口号
- 长度:UDP用户数据报的长度,最小值是8(仅有首部)
- 校验和:检测UDP用户数据报在传输中是否有错,有错就丢弃
网络层封装
网络层接收传输层封装好的数据,继续进行封装。最主要是指定报文需要往哪里传,传输层用的协议是什么(这样在解封装的时候,IP协议就知道把解封装后的数据发送给哪个传输层协议继续进行解封装),以及TTL(生存时间)等信息。IP协议的头部如下:
- 版本:IP 协议的版本。通信双方使用过的 IP 协议的版本必须一致,目前最广泛使用的 IP 协议版本
号为 4(即IPv4) - 首部长度:单位是 32 位(4 字节)
- 服务类型:一般不适用,取值为 0
- 总长度:指首部加上数据的总长度,单位为字节
- 标识(identification):IP 软件在存储器中维持一个计数器,每产生一个数据报,计数器就加 1,
并将此值赋给标识字段 - 标志(flag):目前只有两位有意义。标志字段中的最低位记为 MF。MF = 1 即表示后面“还有分片”的数据报。MF = 0 表示这已是若干数
据报片中的最后一个。标志字段中间的一位记为 DF,意思是“不能分片”,只有当 DF = 0 时才允许分片 - 片偏移:指出较长的分组在分片后,某片在源分组中的相对位置,也就是说,相对于用户数据段的
起点,该片从何处开始。片偏移以 8 字节为偏移单位。 - 生存时间:TTL,表明是数据报在网络中的寿命,即为“跳数限制”,由发出数据报的源点设置这个
字段。路由器在转发数据之前就把 TTL 值减一,当 TTL 值减为零时,就丢弃这个数据报。(假设不存在这个字段,数据报也到达不了指定网络,该数据包就会一直存在网络中,可能会导致网络拥塞的情况) - 协议:指出此数据报携带的数据时使用何种协议,以便使目的主机的 IP 层知道应将数据部分上交
给哪个处理过程,常用的 ICMP(1),IGMP(2),TCP(6),UDP(17),IPv6(41) - 首部校验和:只校验数据报的首部,不包括数据部分。
- 源地址:发送方 IP 地址
- 目的地址:接收方 IP 地址
数据链路层封装
网络层封装进了IP地址,主机还有MAC地址,我们需要将MAC地址也封装到传送的报文中,因此有数据链路层的封装。因此有以太网帧协议:
- 类型:0x800表示 IP、0x806表示 ARP、0x835表示 RARP
这儿存在一个问题:我们知道目的IP地址,但是我们不知道该IP地址对应的主机的MAC地址是什么,所以需要一个协议来解决这个问题。在进行数据链路层封装之前,要使用ARP协议来获取目的IP地址对应主机的MAC地址,ARP头部如下:
- 硬件类型:1 表示 MAC 地址
- 协议类型:0x800 表示 IP 地址
- 硬件地址长度:6
- 协议地址长度:4
- 操作:1 表示 ARP 请求,2 表示 ARP 应答,3 表示 RARP 请求,4 表示 RARP 应答
ARP协议是以太网帧协议上一层的协议,所以以太网帧中类型才会有APR,他的简略工作流程如下:
- 请求目的IP主机的MAC地址的主机组装ARP报文,ARP报文中的目的端以太网地址置为00:00:00:00:00:00,操作置1,然后交由以太网帧协议以广播的形式发送到其他主机上。
- 收到ARP的主机先去掉以太网帧协议头,解析ARP报文,得到目的端的IP地址,和自己的IP地址做对比,不相同,丢弃掉这个报文,相同,则要给出这个ARP报文回应,进入第三步
- 组装ARP报文,操作置2(即ARP应答),将自己的MAC地址附带在报文中,以太网帧协议组帧,发送。
- 请求主机解析报文,得到目的IP地址对应的MAC地址,完成。
自此,数据封装的过程就完成了,主机将组装好的数据发到网络中进行传输。
解封装
解封装过程就是封装过程的逆过程。每层根据对应的报文中的协议类型发送给对应的协议进行处理,得到最终的应用消息。
|