学习于:https://juejin.im/book/5c70dbbe51882562046911bc/section/5c90d1d55188252d7e34d708
在服务器上首先使用 tcpdump -i any port 8080 -nn -A -w test.pcap 进行数据包的截取,然后在客户端进行一次http带参请求。最后把test.pcap文件拿到Windows上使用wireshark进行分析。
下面是整体的结构:

客户端这边是get请求, /blog/index.jsp?content=123
然后当时写的时候一直使用base64编码,所以返回的数据是中文没啥问题,后面的数字不除了问题。

三次挥手和四次握手就不多说了,感觉大家应该都再熟悉不过了。
这次的关键是熟悉几个基本概念。MTU MSS
先看MTU:最大传输单元(英语:MaximumTransmissionUnit,缩写MTU)是指一种通信协议的某一层上面所能通过的最大数据包大小(以字节为单位)。最大传输单元这个参数通常与通信接口有关(网络接口卡、串口等)
通过netstat -i 可以查询使用网卡的MTU大小。

docker0的可以不管,我们关注etho对应的MTU即可。
先来简单了解一下以太网的最大帧和最小帧。
参考: https://blog.csdn.net/ixidof/article/details/7799891

这里主要关注 6字节源mac,6字节目的mac,2字节长度 ,4字节CRC校验。
(这里由于wireshark自身过滤的问题,我们可以观察到数据包在以太网层上的数据是 12字节的源mac和目标mac,再加上2字节表示ipv4或者ipv6 ,因为wireshark就是根据以太网协议进行解析的,并且,当你是从服务器上把text.pcap文件拿到windows上查看时,wireshark还会帮你把以太网层的去掉,变成linux cooked capture这东西

)
这里就有14+4=18字节的数据。加上前面的7+1=8字节。一般来说大家容易忽略掉这9个字节,因为这是一种通信需要,但是里面存储的信息对上层无用。
以太网最小帧大小为64. 64=18+46
以太网最大帧大小为1518 1518=18+1500
这里注意,数据长度限制为46-1500.
1500,就是我们说的MTU。和前面服务器查询出来的数据一致。
注意,这1500字节的数据已经不包含以太网层的数据了,也就是mac地址之类的信息。
如下,我们一般抓取到的数据都是这样分布的。

MTU是以太网层往下的部分。也就是说,它包括了IP层的源目标的IP地址之类的信息。
然后看MSS:
参考百度百科:
MSS(Maximum Segment Size,最大报文长度),是TCP协议定义的一个选项,MSS选项用于在TCP连接建立时,收发双方协商通信时每一个报文段所能承载的最大数据长度。
MSS是TCP数据包每次能够传输的最大数据分段。
为了达到最佳的传输效能,TCP协议在建立连接的时候通常要协商双方的MSS值,这个值TCP协议在实现的时候往往用MTU值代替(需要减去IP数据包包头的大小20Bytes和TCP数据段的包头20Bytes)所以一般MSS值1460
即 MTU(1500) - IP数据包报头(20)- TCP数据报包头(20)= MSS(1460)
然而大多数时候都达不到MSS的长度。
一般来说在3次握手的时候就会传输MSS这类数据:

可以看到syn和syn ack包都是有MSS=1460的指示。
然后拿个包来解析一下:

应用层为http协议:

基本上到这里,大家应该对MTU,MSS这两个基本概念熟悉了吧。简单说,MTU就是以太网层数据域的最大长度,MSS就是TCP层数据域的最大长度。
如果按7层协议分:ip是属于网络层,tcp是传输层。mac地址那部分(我叫做以太网层)应该是数据链路层。即 数据链路层---网络层---传输层---应用层。
欢迎交流讨论。