基本知识
-
三次握手的包
- 序列号与确认号的解释
- 首先要确认收到对方的包需要seq + ack进行确认
- 确认的内容,1. 是否对方收到,2. 收到的数据包的长度,是否是自己发送的长度
client server sync (seq=0 ack=0) --------------------------> sync + ack (seq=0, ack=1) <---------------------------- ack (seq=1 ack=1) ------------------------------>
这里的seq和ack值的含义
- seq表示,包的序号。 (使用wireshark时,它会将原来的随机序号的第一个包置为0)
- ack表示,对前一个包的确认,确认内容是(对方的seq的值 + 对方的包的长度)
- 由于系统会将三次握手的每一个包的长度看做1个字节,所以在第二次回复确认信息(sync+ack)的时候
使用对方的序号seq=0 + 第一次发送来的包(sync)的长度1字节,所以ack=0+1 - 第三个握手包,是客户端发送的第二个包(客户端发送的第一个包是sync握手包),因此seq=1, 由于server发送给client包的长度是1,所以ack=0+1
- 序列号与确认号的解释
-
第一个包
三次握手01.png
-
第二个包
三次握手02.png
-
第三个包
三次握手03.png
-
第四个包
第四个包开始数据传输,这个包的seq=1,包长度segment=21, 所以第五个包的ack应该等于
seq+segment = 22

-
第五个包
可以看到回复第四个包的ack=22
数据传输05.png
seq序列号的算法以及ack的值的算法
A B
1 seq=1 len=100 ack=1000
-------------------->
2 seq=1000, len=1000,ack=101
<-------------------
3 seq=101, len=1000, ack=2000
-------------------->
假设第一次包的seq等于1. 包长度100, ack=1000
那么第二次包的seq等于第一次的ack,即seq=1000, ack等于第一次的seq+len=101,即ack=101.
第三次的seq等于第二次的ack,即seq=101, ack等于第二次的seq+len=2000,即ack=2000.
以此类推
包的有序传输,像接龙一样首尾相接。 那么就变成我的首要如何接上上次的尾。




网友评论