本章的内容主要是将 IP 协议头部、TCP 协议头部、UPD 协议进行说明,其他的介绍将在后续的章节中进行详细介绍。
注:本章内容来自《TCP/IP 详解 卷一 协议》
IP 协议
1.IPv4 头部结构
版本 | IPv4=4 / IPv6=6 |
IHL | 头部长度,保存 IPv4 中32位字的数量(4个字节),是一个4位字段,表示最多15个32位字即60个字节,IPv6 没有这个字段,固定40个字节 TCP 头部结构 |
DS | 区分服务 RFC2474、RFC2475、RFC3260 |
ECN | 显示拥塞通知 |
总长度 | IP数据包总长度,以字节为单位,65535,通过IHL可以知道数据报从哪里开始。 |
标识 | 为了避免将一个数据报分片和其他数据报分片混淆,发送主机通常在每次发送数据报时都将一个内部计数+1,计数器复制到这个标识字段 |
标志 | RF/DF/MF |
分片偏移 | |
生存期 | 数据报可经路由的上限,每经过一个路由就减一,避免陷入循环 |
协议 | 协议包含一个数字,表示有效荷载部分的数据类型,最常用的为17(UPD) 和 6(TCP) |
头部校验 | 仅计算IPv4的头部,不检查有效荷载的正确性,其他协议必须通过自己的机制进行检查重要数据。每次IP跳转都会被重新计算一次 |
2.IPv6 头部结构
版本号 | |
DS | |
ECN | |
流标签 | 流标签字段是 IPv6 数据报中新增的一个字段,占20位,可用来标记报文的数据流类型,以便在网络层区分不同的报文。流标签字段有源节点分配,通过流标签、源地址、目的地址三元组方式就可以唯一标识一条通信流,而不用像 IPv4 那样需要使用五元组方式(源地址、目的地址、源端口、目的端口和传输层协议号)。 |
负载长度 | 有效载荷长度字段是以字节为单位的标识 IPv6 数据报中有效载荷部分(包括所有扩展报头部分)的总长度,也就是除了 IPv6 的基本报头以外的其他部分的总长度,占20位。 |
下一个头部 | 下一个头部字段用来标识当前报头(或者扩展报头)的下一个头部类型,占8位。每种扩展报头都有其对应的值。下一个头部字段内定义的扩展报头类型与 IPv4 中的协议字段值类似,但在 IPv6 数据报中,紧接着 IPv6 报头的可能不是上层协议头部(当没有扩展报头或者为最后一个扩展报头时才是上层协议头),而是 IPv6 扩展报头。 当 IPv6 数据报文承载的是上层协议 ICMPv6、TCP、UDP等的时候,Next Header 的值分别为 58、6、17,这个时候和 IPv4 报文头部中的 Protocol 字段很类似; 当不是以上3种协议类型的时候,IPv6 报文头部紧接的是扩展头部。扩展头部是 IPv6 引入的一个新的概念,每个 IPv6 的数据报文可以承载0个或多个扩展头部,扩展头部通过链表的形式组织起来。当 IPv6 数据报文承载着扩展头部的时候,Next Header 的数值为扩展头部的类型值。 |
跳数限制 |
3.IPv6 相比 IPv4
IPv6 去除了 IPv4 报头中的头部长度、标识、标志、段偏移、校验和、选项、填充这么多字段,却只增加了流标签这一个字段,因此 IPv6 报头处理和I Pv4 报头处理相比大大简化,提高了处理效率。另外,IPv6 为了更好地支持各种选项处理,提出了扩展头的概念,新增选项时不必修改现有的结构就能做到,理论上可以无限扩展,体现了优异的灵活性。
UDP协议
用户数据报协议 UDP(User Datagram Protocol)特点:
(1)无连接。
(2)尽最大努力的交付。
(3)面向报文。
(4)无拥塞控制。
(5)支持一对一、一对多、多对一、多对多的交互通信。
(6)首部开销小(只有四个字段:源端口、目的端口、长度、检验和)。UDP 是面向报文的传输方式是应用层交给 UDP 多长的报文,UDP 发送多长的报文,即一次发送一个报文,因此,应用程序必须选择合适大小的报文。
1.UDP协议头部结构
长度 | 长度是 UDP 头部和 UDP 数据的总长度。 |
校验和 | 端到端的传输层校验和。它覆盖 UDP 头部、UDP 数据和一个伪头部 |
2.UDP 伪头部
3.UDP/IP分片
例如:前置条件 MTU=1500 Data Lenght= 2992。
说明:
一个数据包包含了2992字节的应用数据,和8个 UDP头部,结果产生一个总长度为3020数据报(包含 Ipv4 头部)。当数据报被分成三组时,额外产生了40个额外字节,因此总发生字节为3060 |
偏移 以8个字节为单位: 185*8 370*8 |
重组: 当 MF=0 的分片被接收到时,重组程序才能确认原始数据的长度,它等于分片偏移的值(乘以8) 加上 IPv4 总长度的值(减去IPv4头部长度)。(370*8+40==3000) 因为每个偏移字段都是相对原始数据报的,重组进程可以处理非顺序到达的分片。 |
重组超时: 一个数据报的任何一个分片首先到达,IP 层就得启动一个计时器,如果不这样做的话,不能达到的分片,可能会最终导致接收方用尽缓存。留下攻击的机会。 |
分片是透明的,但如果一个分片丢失,整个数据报就丢失。要知道IP自身没有差错纠正。所以要么程序自己实现超时和重传。要么尽量避免分片 |
4. UDP SOCKET 连接流程图
TCP 协议
传输控制协议 TCP(Transmission Control Protocol)特点:
(1)面向连接,每一个 TCP 连接只能是点对点的(一对一)。
(2)提供可靠交付服务。
(3)提供全双工通信。
(4)面向字节流。
(5)应用程序和 TCP 的交互是一次一个数据块(大小不等),但 TCP 把应用程序看成是一连串的无结构的字节流。TCP 有一个缓冲,当应该程序传送的数据块太长,TCP 就可以把它划分短一些再传送。
1.TCP头部结构
头部字段:
序列号 | 标识了 TCP 发送端到 TCP 接收端的数据流的一个字节,该字节代表着包含该序列号的报文段的数据中的第一个字节。 |
确认号 | 包含的值是该确认号的发送方期待收到的下一个序列号,即最后被成功接收的数据字节的序列号加1. |
SYN | 建立新连接时发送的第一个报文。序列号字段包含了在本次连接的这个方向上要使用的第一个序列号,后续序列号和返回的 ACK 号,也在这个方向上。注意,初始化序列号是随机选择的。 |
头部长度 | 头部的长度,4位,限定最多60个字节(带选项)。不带选项20个字节 |
CWR | 拥塞窗口减(发送方降低它的发送速率) |
ECE | ECN 回显(发送方接收到了一个更早的拥塞通告) |
URG | 紧急 |
ACK | 确认(确认号字段有效,一般建立连接之后启用) |
PSH | 推送(接收方应尽快给应用程序传送这个数据) |
RST | 重置连接(连接取消),相当 Ctl+C |
FIN | 该报文段的发送方已经结束向对方发送数据。 |
TCP校验和 | 覆盖了 TPC 的头部和数据以及头部中的一些字段 |
紧急指针 | 只有在 URG 位字段被设置时才有效,这个“指针”是一个必须要加到报文段的序列号字段上的正偏移,以产生紧急数据的最后一个字节的序列好 |
选项字段:
MSS | 最大段大小指 TCP 协议所允许的从对方接收到的最大报文段(不包括 TCP 与 IP 头部),没有指明的情况下,默认536字节 |
SACK | 确认选项,由于 TCP 采取的是累计 ACK 确认,TCP 不能正确地确认之前已经接收到数据。由于接收的数据也是无序的,所以接收到数据的序列号也是不连续的,会出现很多空洞,TCP接收方,需要防止应用程序使用超出空洞的数据。当接收到乱序的数据时,它能提供一个SACK 选项来描述这些乱序数据,从而帮助对方有效的重传。 |
WSOPT | 窗口缩放因子 |
UTO | 用户超时 |
TCP-AO | 认证选项 |
TSOPT | 时间戳选项 |
NOP | 无操作 |
2.TCP SOCKET 连接流程图
UDP 和 TCP 区别
TCP 与 UDP 的一个基本区别, TCP 是可靠通信协议, 而 UDP 是不可靠通信协议。
TCP 的可靠性含义: 接收方收到的数据是完整, 有序, 无差错的。
UDP 不可靠性含义: 接收方接收到的数据可能存在部分丢失, 顺序也不一定能保证。