tcp3握4挥

格式

(网图,不记得来源)

在这里插入图片描d

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

  1. ACK 和 ack有啥区别?
    ACK是表示一方是否收到了报文,取值为0,1. ack表示收到了哪一条报文,取值为发送方的报文seq+1

  2. 为什么握手只有三次,而挥手是4次?
    因为握手时,服务端复用了一次发送握手,同时传达了SYNC和ACK。而挥手时,服务端连续挥了两次手,分别是ACK和FIN。 至于为什么这两次手不一起挥,可能合在一起挥,遇到了一些问题,所以才不得已分开挥,这个我也不太清楚。网上的思路都是 ‘服务端的第一次挥手,关闭了c端发给s端的通道,只有再由服务端来一轮挥手,才能关闭s到c的通道’,但是感觉还是没解释清楚,为什么第二三次挥手合成一次,会做不到关闭s和c。

  3. 客户端,服务端在挥手时状态变换是?
    client:
    FIN-WAIT1 发送fin后
    FIN-WAIT2 接受ack后
    TIMEWAIT 收到fin后
    CLOSE 等待2个MSL后
    server:
    CLOSE-WAIT
    LAST-ACK
    CLOSE

  4. tcp的报文是不会丢失的吗?
    会丢失,只是有重发机制可以重发。其次,客户端的timewait也只会等2个msl,多了就会丢弃。

  5. close-wait是服务端连续两次挥手的临时状态,可能超时存在吗?
    可能,比如代码事务不提交,回滚。参考链接:
    https://segmentfault.com/a/1190000017313251

  6. Timewait 两端都存在吗?
    只存在主动断开的一方,客户端,并且,会持续2个msl周期。为什么要持续2个msl,为了防止服务端的fin信号收不到ack,方便客户端重发

猜你喜欢

转载自blog.csdn.net/fwhezfwhez/article/details/109518270