格式
(网图,不记得来源)
1. ACK
确认收到报文。
A向B发送一条请求,那么B可以回复一条ACK给A,告诉A他已经收到了。ack=seq种子+1。
ACK和ack不是一个东西,前者取值为0,1,标记是否收到。后者标记收到哪条
2. SYNC
请求建立连接信号.
3. FIN
请求关闭本方数据写入
seq
tcp连接中的报文,每一个byte都会让seq标记自增1。
初始值是随机生成的。
两个方向的通道,seq初始值是不同的。
作用: 保证报文的可靠性。
FAQ
-
ACK 和 ack有啥区别?
ACK是表示一方是否收到了报文,取值为0,1. ack表示收到了哪一条报文,取值为发送方的报文seq+1 -
为什么握手只有三次,而挥手是4次?
因为握手时,服务端复用了一次发送握手,同时传达了SYNC和ACK。而挥手时,服务端连续挥了两次手,分别是ACK和FIN。 至于为什么这两次手不一起挥,可能合在一起挥,遇到了一些问题,所以才不得已分开挥,这个我也不太清楚。网上的思路都是 ‘服务端的第一次挥手,关闭了c端发给s端的通道,只有再由服务端来一轮挥手,才能关闭s到c的通道’,但是感觉还是没解释清楚,为什么第二三次挥手合成一次,会做不到关闭s和c。 -
客户端,服务端在挥手时状态变换是?
client:
FIN-WAIT1 发送fin后
FIN-WAIT2 接受ack后
TIMEWAIT 收到fin后
CLOSE 等待2个MSL后
server:
CLOSE-WAIT
LAST-ACK
CLOSE -
tcp的报文是不会丢失的吗?
会丢失,只是有重发机制可以重发。其次,客户端的timewait也只会等2个msl,多了就会丢弃。 -
close-wait是服务端连续两次挥手的临时状态,可能超时存在吗?
可能,比如代码事务不提交,回滚。参考链接:
https://segmentfault.com/a/1190000017313251 -
Timewait 两端都存在吗?
只存在主动断开的一方,客户端,并且,会持续2个msl周期。为什么要持续2个msl,为了防止服务端的fin信号收不到ack,方便客户端重发