
客户端:192.168.143.11,服务端:112.80.248.76
三次握手
客户端发起第一次握手
从Frame中可以看到此为第一帧Frame Number: 1
Internet Protocol Version 4可以查看IP报文 
Transmission Control Protocol可以查看TCP报文
从下图中可以看到,TCP报文中包括了:
Source Port:63425源端口Destination Port:80目标端口Sequence Number:0序列号Acknowledgment Number:0确认号FlagsSYN:1请求连接
Window:65535协商窗口Options选项MSS:1460:Maximun segment sizeNOP:No-OprationWindow scaleSACK permitted

TCP报文头部至少20个字节:
- 源端口和目标端口分别
2个字节,就是16位,2**16 - 1所以最多65535个端口 - 序列号
4个子节 - 确认号
4个字节 - 标志位,滑动窗口等一起
4个字节 -
为什么序列号要随机?
Sequence Number(raw):2348159985
为什么序列号要随机生成,为了防止伪造IP可伪造Acknowledgment Number只发起第一次握手和第三次握手,从而建立连接服务端响应第二次握手
服务端发起响应:
Sequence Number:0序列号Acknowledgment Number:1确认号Flags标志位SYN:1Acknowledgment:1
Window:8192滑动窗口Options可选项MSS:1452Window scale:5
客户端响应第三次握手
客户端收到服务端的响应之后,发起响应:
Sequence Number: 1序列号Acknowledgment Number:1确认号Flags标志位Acknowledgment:1
-
Http 请求
三次握手建立连接之后,发起
Http请求 Sequence Number:1Acknowledgment Number:1Flags标志位Acknowledgment:1Push:1
Window:4096
Http报文
服务端TCP响应Http
服务端收到客户端的GET请求之后,发起TCP响应
Sequence Number:1因为服务端还没开始发送数据,所以序列号是1Acknowledgment Number:78客户端已经发起GET请求,其中请求头77个字节,所以确认号是78Flags标志位Acknowledgment:1
Window:908传输数据
服务端发送数据
服务端TCP响应完客户端HTTP GET请求之后,开始响应数据
第一波数据:
Sequence Number:1Acknowledgment Number:78TCP Segment Len:1440FlagsAcknowledgment:1Push:1
第二波数据:
Sequence Number:1441Acknowledgment Number:78TCP Segment Len:1341FlagsAcknowledgment:1Push:1
客户端响应第一波数据:
Sequence Number:78Acknowledgment Number:1441FlagsAcknowledgment:1
客户端响应第二波数据:
Sequence Number:78Acknowledgment Number:2782Flags客户端发起断开连接请求
Flags:ACK:1,Fin:1
- 服务端收到请求之后响应
Flags:ACK:1
- 服务端处理完成,发起断开连接请求:
Flags:Fin:1,ACK:1
客户端收到之后确认:
客户端发起连接请求会消耗
1个客户端序列号- 服务端响应建立连接也会消耗
1个服务端序列号 - 客户端发起断开连接请求会消耗
1个客户端序列号 - 服务端发起断开连接请求也会消耗
1个服务端序列号
为什么SYN和FIN需要占用序列号
可以这样理解:
因为SYN和FIN也是需要被确认的,只要是需要被确认的就需要占序列号
不然如果序列号不增加的话,举一个场景:
客户端接收到数据之后,发起断开连接FIN请求,此时服务端响应ACK,这里需要响应两个ACK
可是两个ACK的Acknowledgment Number都是都是一样的,就无法确认服务器的ACK是对于哪个进行ACK了
