赞
踩
QQ群:852283276
微信:arm80x86
微信公众号:青儿创客基地
B站:主页 https://space.bilibili.com/208826118
TCP/IP详解卷1:协议
网络七层协议
Wireshark 分析ping报文
EtherType :以太网类型字段及值
IP分片报文的接收与重组
TCP 的那些事 | TCP报文格式解析
TCP选项之SACK选项概述
TCP 的那些事 | SACK
IP分片和TCP分段
【网络协议】TCP分段与IP分片
关于“TCP segment of a reassembled PDU”
流重组讲解四部曲(一)- IP、TCP流重组概念理解
【TCP/IP协议】TCP中的MSS解读
Windows系统下的TCP参数优化
为什么没收到对端 MSS 选项,TCP 就采用 536 这个 MSS 值?
TCP选项之MSS
什么是MTU?为什么MTU值普遍都是1500?
数据链路层之以太网、MAC、MTU详解
linux内核 checksum,Linux 内核IP和UDP检验和计算
TCP数据包的封装过程,UDP类似,但是UDP数据包的首部只有8字节。有一个特殊的情况,以太网帧中可以是一个完整的IP数据报,也可以是IP数据报的一个分片(fragment)。
通常我们采用的是RFC894协议中的格式,IEEE802/RFC1042了解一下即可,
类型值 | 协议名 |
---|---|
0800 | IP |
0806 | ARP |
8035 | RARP |
86dd | IPv6 |
![]() | |
以太网帧中的数据长度规定最小46字节,最大1500字节,一个标准的以太网数据帧大小是1518,头信息有14字节,尾部校验和FCS占了4字节,所以数据的大小就是:1518 - 14 - 4 = 1500 |
协议值 | 协议名 |
---|---|
1 | ICMP |
2 | IGMP |
6 | TCP |
17 | UDP |
具有本地磁盘的系统引导时,一般是从磁盘上的配置文件中读取IP地址。但是无盘机,如X终端或无盘工作站,则需要采用其他方法来获得IP地址。RARP分组的格式与ARP分组基本一致。它们之间主要的差别是RARP请求或应答的帧类型代码为0x8035,而且RARP请求的操作代码为3,应答操作代码为4。对应于ARP,RARP请求以广播方式传送,而RARP应答一般是单播( unicast)传送的。
类型字段可以有15个不同的值,以描述特定类型的ICMP报文。某些ICMP报文还使用代码字段的值来进一步描述不同的条件。
检验和字段覆盖整个ICMP报文。使用的算法与I P首部检验和算法相同。
对于其他类型的ICMP查询报文,服务器必须响应标识符和序列号字段。另外,客户发送的选项数据必须回显,假设客户对这些信息都会感兴趣。
Unix系统在实现ping程序时是把ICMP报文中的标识符字段置成发送进程的ID号。这样即使在同一台主机上同时运行了多个ping程序实例,ping程序也可以识别出返回的信息。序列号从0开始,每发送一次新的回显请求就加1。ping程序打印出返回的每个分组的序列号,允许我们查看是否有分组丢失、失序或重复。IP是一种最好的数据报传递服务,因此这三个条件都有可能发生。
旧版本的ping程序曾经以这种模式运行,即每秒发送一个回显请求,并打印出返回的每个回显应答。但是,新版本的实现需要加上- s选项才能以这种模式运行。默认情况下,新版本的ping程序只发送一个回显请求。如果收到回显应答,则输出host is alive
;否则,在20秒内没有收到应答就输出no answer
。
IGMP的校验和位置核ICMP是一样的,
unsigned short checksum(unsigned short *buf,int nword)
{
unsigned long sum;
for(sum = 0; nword > 0; nword--)
sum += *buf++;
sum = (sum >> 16) + (sum & 0xffff);
sum += (sum >> 16);
return ~sum;
}
2^32-1
后又从0开始。当建立一个新的连接时,SYN标志变1。序号字段包含由这个主机选择的该连接的初始序号ISN(Initial Sequence Number)。该主机要发送数据的第一个字节序号为这个ISN加1,因为SYN标志消耗了一个序号。既然每个传输的字节都被计数,确认序号包含发送确认的一端所期望收到的下一个序号。因此,确认序号应当是上次已成功收到数据字节序号加 1。只有ACK标志为1时确认序号字段才有效。发送ACK无需任何代价,因为32bit的确认序号字段和ACK标志一样,总是TCP首部的一部分。因此,我们看到一旦一个连接建立起来,这个字段总是被设置, ACK标志也总是被设置为1。TCP为应用层提供全双工服务。这意味数据能在两个方向上独立地进行传输。因此,连接的每一端必须保持每个方向上的传输数据序号。TCP可以表述为一个没有选择确认或否认的滑动窗口协议。我们说TCP缺少选择确认是因为TCP首部中的确认序号表示发方已成功收到字节,但还不包含确认序号所指的字节。当前还无法对数据流中选定的部分进行确认。例如,如果1~1024字节已经成功收到,下一报文段中包含序号从2049~3072的字节,收端并不能确认这个新的报文段。它所能做的就是发回一个确认序号为1025的ACK。它也无法对一个报文段进行否认。例如,如果收到包含1025~2048字节的报文段,但它的检验和错, TCP接收端所能做的就是发回一个确认序号为1025的ACK。标志 | 含义 |
---|---|
URG | 紧急指针(urgent pointer)有效 |
ACK | 确认序号有效 |
PSH | 接收方应该尽快将这个报文段交给应用层 |
RST | 重建连接 |
SYN | 同步序号用来发起一个连接 |
FIN | 发端完成发送任务 |
TCP最多有60字节的首部,正常的长度是20字节,所以选项最多为40字节,每个选项的开始是1字节kind字段,说明选项的类型。kind字段为0和1的选项仅占1个字节。其他的选项在kind字节后还有len字节。它说明的长度是指总长度,包括kind字节和len字节。设置无操作选项的原因在于允许发方填充字段为 4字节的倍数。
下面是一个TCP3次握手的抓包,用到了3个选项,最长报文大小(MSS),窗口扩大选项(WS),SACK
65535×(2^2)
)。这个选项只能够出现在一个SYN报文段中,因此当连接建立起来后,在每个方向的扩大因子是固定的。为了使用窗口扩大,两端必须在它们的SYN报文段中发送这个选项。主动建立连接的一方在其 SYN中发送这个选项,但是被动建立连接的一方只能够在收到带有这个选项的SYN之后才可以发送这个选项。每个方向上的扩大因子可以不同。UDP会造成IP分片,但是TCP不会造成IP分片,这是因为TCP自己支持分段,将数据拆分成小包传给网络层,最大的分段大小MSS相当于MTU减去IP头和TCP头,所以一个MSS恰好装进MTU中,几乎不会造成IP分片。TCP在建立连接进行的三次握手的前两个握手包中双方互相声明自己的MSS。
IP数据报分片后,只有第一片带有UDP首部或ICMP首部,其余的分片只有IP头部,到了端点后根据IP头部中的信息再网络层进行重组。而TCP报文段的每个分段中都有TCP首部,到了端点后根据TCP首部的信息在传输层进行重组。IP数据报分片后,只有到达目的地后才进行重组,而不是向其他网络协议,在下一站就要进行重组。对IP分片的数据报来说,即使只丢失一片数据也要重新传整个数据报(既然有重传,说明传输层使用的是具有重传功能的协议,如TCP协议)。这是因为IP层本身没有超时重传机制,必须由更高层协议来负责超时和重传。当来自TCP报文段的某一段(在IP数据报的某一片中)丢失后,TCP在超时后会重发整个TCP报文段,该报文段对应于一份IP数据报(可能有多个IP分片),没有办法只重传数据报中的一个数据分片。
TCP是一个字节流协议,TCP绝不会以杂乱的次序给接收应用程序发送数据。因此,TCP接收端可能会被迫先保持大序列号的数据不交给应用程序,直到缺失的小序列号的报文段被填满,最终按序将数据提交给应用程序,这也是TCP重组的目的。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。