由于 TCP 连接是全双工的,因此,每个方向都必须要单独进行关闭,这一原则是当一方完成
数据发送任务后,发送一个 FIN 来终止这一方向的连接,收到一个 FIN 只是意味着这一方向
上没有数据流动了,即不会再收到数据了,但是在这个 TCP 连接上仍然能够发送数据,直到
这一方向也发送了 FIN。首先进行关闭的一方将执行主动关闭,而另一方则执行被动关闭,
上图描述的即是如此。
第一次挥手:
Client 发送一个 FIN,用来关闭 Client 到 Server 的数据传送,Client 进入 FIN_WAIT_1 状
态。
第二次挥手:
Server 收到 FIN 后,发送一个 ACK 给 Client,确认序号为收到序号+1(与 SYN 相同,一个
FIN 占用一个序号),Server 进入 CLOSE_WAIT 状态。
第三次挥手:
Server 发送一个 FIN,用来关闭 Server 到 Client 的数据传送,Server 进入 LAST_ACK 状态。
第四次挥手:
Client 收到 FIN 后,Client 进入 TIME_WAIT 状态,接着发送一个 ACK 给 Server,确认序号
为收到序号+1,Server 进入 CLOSED 状态,完成四次挥手。
5.tcp 为什么建立连接是三次握手,而关闭连接却是四次挥手呢?
当主机 A 确认发送完数据且知道 B 已经接受完了,想要关闭发送数据口(当然确认信号还是
可以发),就会发 FIN 给主机 B;主机 B 收到 A 发送的 FIN,表示收到了,就会发送 ACK 回
复;但这是 B 可能还在发送数据,没有想要关闭数据口的意思,所以 FIN 与 ACK 不是同时发
送的,而是等到 B 数据发送完了,才会发送 FIN 给主机 A;A 收到 B 发来的 FIN,知道 B 的
数据也发送完了,回复 ACK, A 等待 2MSL 以后,没有收到 B 传来的任何消息,知道 B 已经
收到自己的 ACK 了,A 就关闭链接,B 也关闭链接了。
6.TCP 头大小,包含字段?
TCP 协议头最少 20 个字节,包括 TCP 的源端口,目的端口,序列号,应答号等等。
评论3