TCP 三次握手图示:
注意:
- 在第二步 server 收到 client 的连接请求的时候,server 就会分配相关的资源「allocates the TCP buffers and variables to the connection」,这也是导致 TCP 容易遭受 SYN 泛洪攻击即拒绝服务攻击的原因「makes TCP vulnerable to a denial-of-service attack known as SYN flooding」
在第三步 client 收到 SYNACK 段时,client 才会为该连接分配资源,这一次的 SYN=0 阶段,可能会捎带数据 - 为什么需要三次握手,最后一次可以省掉吗?
不能,原因是第一个请求有可能是在网络节点中长时间的滞留了,以致延误到前一个连接释放之后的某个时间才到达 server,server 会误以为 client 想建立连接,实际上 server 发出第二个请求之后,只会等待一段时间,如果没有收到 ACK,那么将释放为这个连接分配的资源,三次握手可以防止服务器端的一直等待而浪费资源。
TCP 四次挥手图示:
注意:
- FIN_WAIT_1状态实际上是当SOCKET在ESTABLISHED状态时,它想主动关闭连接,向对方发送了FIN报文
- FIN_WAIT_2状态下的SOCKET,表示半连接,也即有一方要求close连接,但另外还告诉对方,我暂时还有点数据需要传送给你(ACK信息),稍后再关闭连接
- server 端的 CLOSE_WAIT 的作用是先正常发送回应的 ACK,然后判断自己有没有还要发送的数据,没有就发送 FIN,自己 close 掉
- server 端真正 close 掉连接应该是收到最后一个 ACK 时
- client 有一个 TIME_WAIT 的过程,是在发出最后的一个 ACK 的请求之后,有两个作用,一是可靠的关闭掉 TCP 全双工连接(这个 ACK 可能丢失,如果 server 收不到 ACK 的话,会重发),二是允许网络中上一次连接的包都消失,而不影响新的连接
完整图示: