首页 > 代码库 > TCP 3次握手和四次挥手

TCP 3次握手和四次挥手

1.标示符说明

   位码即tcp标志位:

 

           SYN(synchronous建立联机)   ACK(acknowledgement 确认)  PSH(push传送)    FIN(finish结束)   RST(reset重置)   URG(urgent紧急)  Sequence number(顺序号码)   Acknowledge number(确认号码)

 

2.建立一个连接需要三次握手:

image

 

        (1)第一次握手:主机A发送位码为syn=1,随机产生seq number=1234567的数据包到服务器,主机B由SYN=1知道,A要求建立联机;

        (2)第二次握手:主机B收到请求后要确认联机信息,向A发送ack number=(主机A的seq+1),syn=1,ack=1,随机产生seq=7654321的包

        (3)第三次握手:主机A收到后检查ack number是否正确,即第一次发送的seq number+1,以及位码ack是否为1,若正确,主机A会再发送ack number=(主机B的seq+1),ack=1,主机B收到后确认seq值与ack=1则连接建立成功。

        (4)完成三次握手,主机A与主机B开始传送数据。

示例:

      IP 192.168.1.116.3337 > 192.168.1.123.7788: S 3626544836:3626544836
      IP 192.168.1.123.7788 > 192.168.1.116.3337: S 1739326486:1739326486 ack 3626544837
      IP 192.168.1.116.3337 > 192.168.1.123.7788: ack 1739326487

 PS:  初始序列号最开始为1,然后每隔0.5秒就增加64000.  假若客户端重新启动38分钟后运行。它对应的初始序号为:291008001(38*60*64000*2)

3. 终止一个连接要经过4次挥手:

                                                         

        (1)第一次挥手:Client发送一个FIN,用来关闭Client到Server的数据传送,Client进入FIN_WAIT_1状态。
        (2)第二次挥手:Server收到FIN后,发送一个ACK给Client,确认序号为收到序号+1(与SYN相同,一个FIN占用一个序号),Server进入CLOSE_WAIT状态。
        (3)第三次挥手:Server发送一个FIN,用来关闭Server到Client的数据传送,Server进入LAST_ACK状态。

        (4)第四次挥手:Client收到FIN后,Client进入TIME_WAIT状态,接着发送一个ACK给Server,确认序号为收到序号+1,Server进入CLOSED状态,完成四次挥手。

4.为什么建立连接是三次握手,而关闭连接却是四次挥手呢?
      这是因为服务端在LISTEN状态下,收到建立连接请求的SYN报文后,把ACK和SYN放在一个报文里发送给客户端。而关闭连接时,当收到对方的FIN报文时,仅仅表示对方不再发送数据了但是还能接收数据,己方也未必全部数据都发送给对方了,所以己方可以立即close,也可以发送一些数据给对方后,再发送FIN报文给对方来表示同意现在关闭连接,因此,己方ACK和FIN一般都会分开发送

 

 

参考: http://blog.chinaunix.net/uid-7411781-id-3812206.html

       http://www.cnblogs.com/hnrainll/archive/2011/10/14/2212415.html