三次握手和四次挥手

整理tcp相关知识,这是第二篇。


三次握手

  1. 首先B的服务器进程创建传输控制块TCB,等待客户端的连接请求。此时服务端处在LISTEN(监听)状态

  2. A的客户进程同样要先创建TCB,然后向B发送连接请求报文段(SYN为1,选择一个初始序号a,且此报文段不携带数据,但消耗一个序号),这时A进入SYN-SENT(同步已发送)状态

  3. B收到请求后,向A发送确认(SYN和ACK都为1,确认号为a+1,同时为自己选择一个初始序号b,同样不携带数据,消耗一个序号),B进入SYN-RCVD(同步收到)状态

  4. A收到B的确认之后,再向B发送确认(ACK为1,确认号为b+1,自己的序号为a+1,如果不携带数据不消耗序号),A进入ESTABLISHED(已建立连接)状态

  5. B收到A的确认之后也进入STABLISHED(已建立连接)状态。

四次挥手

  1. A的应用进程向其TCP发送连接释放报文段,并停止发送数据。(FIN为1,即使不携带数据也要消耗一个序号)A进入FIN-WAIT-1(终止等待1)状态

  2. B收到连接释放报文后即发送确认,进入CLOSE-WAIT(关闭等待)状态。此时可以认为A向B发送数据的连接已经被拆除了,TCP连接处于半关闭状态

  3. A收到来自B的确认进入FIN-WAIT-2(终止等待2)状态

  4. 当B没有数据要发送给A时,发送连接释放报文段(FIN为1,重复上次已经发送过的确认号),B进入LAST-ACK(最后确认)状态

  5. A收到B的连接释放报文后发送确认,进入TIME-WAIT(时间等待状态)

  6. B收到A的确认之后就进入CLOSED(关闭)状态

  7. A在TIME-WAIT状态必须等待时间等待计数器设置的2MSL之后才能进入CLOSED状态。MSL叫最长报文段寿命。(设置MSL是为了保证A最后发送的确认能到达B,如果B没收到会重传连接释放报文段;同时防止网络中存在已经失效的连接报文,在2MSL的时间内可以使本连接产生的所有报文都从网络中消失)



letangers wechat
关注一波,写写bug