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长度即可判断是否有丢包。