QQ群:852283276 微信:arm80x86 微信公众号:青儿创客基地 B站:主页 https://space.bilibili.com/208826118
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了解一下即可,
具有本地磁盘的系统引导时,一般是从磁盘上的配置文件中读取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。
host is alive
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
TCP最多有60字节的首部,正常的长度是20字节,所以选项最多为40字节,每个选项的开始是1字节kind字段,说明选项的类型。kind字段为0和1的选项仅占1个字节。其他的选项在kind字节后还有len字节。它说明的长度是指总长度,包括kind字节和len字节。设置无操作选项的原因在于允许发方填充字段为 4字节的倍数。 下面是一个TCP3次握手的抓包,用到了3个选项,最长报文大小(MSS),窗口扩大选项(WS),SACK
65535×(2^2)
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重组的目的。