三次握手过程
- client端建⽴连接,发送⼀个SYN同步包,发送之后状态变成SYN_SENT
- server端收到SYN之后,同意建⽴连接,返回⼀个ACK响应,同时也会给client发送⼀个SYN包,发送完成之后状态变为SYN_RCVD
- client端收到server的ACK之后,状态变为ESTABLISHED,返回ACK给server端。server收到之后状态也变为ESTABLISHED,连接建⽴完成。
思考: 为什么要3次?2次,4次不⾏吗?
因为TCP是双⼯传输模式,不区分客户端和服务端,连接的建⽴是双向的过程。
如果只有两次,⽆法做到双向连接的建⽴,从建⽴连接server回复的SYN和ACK合并成⼀次可以看出 来他也不需要4次。
挥⼿为什么要四次?因为挥⼿的ACK和FIN不能同时发送,因为数据发送的截⽌时间不同
四次握手过程
- client端向server发送FIN包,进⼊FIN_WAIT_1状态,这代表client端已经没有数据要发送了
- server端收到之后,返回⼀个ACK,进⼊CLOSE_WAIT等待关闭的状态,因为server端可能还有没有发送完成的数据
- 等到server端数据都发送完毕之后,server端就向client发送FIN,进⼊LAST_ACK状态
- client收到ACK之后,进⼊TIME_WAIT的状态,同时回复ACK,server收到之后直接进⼊CLOSED状态,连接关闭。但是client要等待2MSL(报⽂最⼤⽣存时间)的时间,才会进⼊CLOSED状态
思考: 为什么要等待2MSL的时间才关闭?
-
为了保证连接的可靠关闭。如果server没有收到最后⼀个ACK,那么就会重发FIN
-
为了避免端⼝重⽤带来的数据混淆。如果client直接进⼊CLOSED状态,⼜⽤相同端⼝号向server建⽴⼀个连接,上⼀次连接的部分数据在⽹络中延迟到达server,数据就可能发⽣混淆了