关于TCP包的seq和ack号计算方法(个人理解)

SYN包;ACK包;FIN包;PSH包;

SYN/FIN的传输虽然没有data,但是会让下一次传输的packet seq增加一。

seqNumber:本包的数据是从什么位置开始的,表明数据的位置。

AckNumber:我希望对方下一次的包中,数据是从什么位置开始的。也是作为校验的重点。

三次握手(1~3)

第一次握手:客户端发送SYN包请求连接

SYN=1   //代表是SYN包

seqNumber = 0    //由于是第一次发送,则数据是在地址0开始计算,即告诉服务器,我的数据是从整个包的0开始的

AckNumber = 0     //由于未收到过数据,则告诉服务器,若你要给我发送数据,你的数据应该从你的包的第0位开始。

第二次握手:服务器发送SYN,ACK包回复

SYN=1  //SYN包

ACK=1 //ACK包

seqNumber = 0   //由于这是服务器第一次发送,则会把数据从地址0开始放

AckNumber = 1   //由于客户端的数据是从0开始的(客户端的seqNumber=0),并且是发的SYN包,所以我希望下一次你给我发数据是从你的seqNumber+1 = 1开始

第三次握手:客户端发送ACK包确认

ACK=1 //ACK包

seqNumber = 1   //因为服务器希望客户端从1开始放数据,那么就满足他

AckNumber = 1    //服务器上一次发数据是从0开始,并且也发了一次SYN包,那么下一次服务器发数据过来就也要从1开始

 

长连接数据发送(4-17)

1、客户端发出第一次指令,指令长度为725

PSH = 1 

ACK = 1

Len:725   //指令长度是725

seqNumber = 1 //由于上一次服务器让我们从1开始放数据(可回看第二次握手)

AckNumber = 1 //由于上一次服务器发送的数据是从0开始,并且发的是SYN包(可回看第二次握手)

2、服务器回复数据,回复第一次,数据长度为1448

ACK=1

seqNumber = 1 //由于客户端希望我们从1开始放数据

AckNumber = 726  //由于客户端上一次发送数据是从1开始的(1中的seqNumber),并且放了725长度的数据,则我希望客户端下一次给我发数据是从726以后开始放

Len:1448    //服务器回复了一个1448长度的包

3、客户端确认

ACK=1

seqNumber = 726  //服务器希望我们从726开始

AckNumber = 1449  //服务器上一次是从1开始发送,并且发了1448长度的包,则我希望服务器下一次发送是从1449开始

//注意,ACK包不占用空间,并且没有发送数据过去,则下一次依然是从726开始,即seqNumber=726

4、服务器回复数据,回复第二次,数据长度是1448

ACK=1

seqNumber = 1449   //客户端希望我们从1449开始发

AckNumber = 726   //客户端若要回复我数据,需要从729开始

Len:1448   //发送第二次包

5、客户端确认

ACK=1

seqNumber = 726

AckNumber =2897

 

TCP是安全的

由于发送数据的时候会把序列号(seqNumber)与数据发过去。对方会把seqNumber跟数据长度项加,放到AckNumber中回传。只需要对比发过去的seqNumber+数据长度是否等于返回的AckNumber长度即可判断是否有丢包。

  • 2
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值