码迷,mamicode.com
首页 > 其他好文 > 详细

TCP协议的建立与释放及TCP的有限状态基

时间:2016-05-17 22:50:01      阅读:335      评论:0      收藏:0      [点我收藏+]

标签:tcp创建连接释放连接   状态基   

一、TCP的链接建立(三次握手)

如下图所示:假定最初两端的TCP进程都处于关闭状态。下图中,client主动打开链接,server被动打开链接

    

技术分享

创建过程:

    ①、server的TCP服务器进程先创建传输控制块TCB(存储了每一个链接中的重要信息),准备接受client进程的连接请求。然后服务器进程就处于LISTEN(收听)状态,等待客户的连接请求。如有,作出响应。

    ②、client的TCP客户进程也是首先创建传输控制模块TCB,然后向server发出连接请求报文段,这时首部中的同步位SYN =1,同时选择一个初始序号 seq =1000,TCP规定,SYN报文段不能携带数据,但要消耗一个序号。这时,TCP客户进程进入SYN-SENT(同步以发送)状态。mss表示最大段尺寸,

如果一个段太大,封装成帧后超过了链路层的最大帧长度,就必须在IP 层分片,为了避免这种情况,客户端声明自己的最大段尺寸,建议服务器端发来的段不要超过这个长度。

    ③、server收到连接请求报文段后,如同意建立连接,则向client发送确认。在确认报文段中应把SYN 为和ACK 位都置1,确认号是ack =1001,同时也为自己选择一个初始序号seq=8000。这个报文段也不能携带数据,但同样要消耗一个序号。这时TCP服务器进程进入SYN-RCVD(同步收到)状态。

    ④、TCP客户进程收到server的确认后,还要向server给出确认,确认报文段ACK 置1,确认号ack =8001,而自己序号为seq=1002,TCP的标准规定,ACK 报文段可以携带数据。但如果不携带数据则不消耗序号,这种情况下,下一个数据报文段的序号仍是seq =1002.这时,TCP连接已经建立,client进去ESTABLISHED(已建立连接)状态。

    ⑤、当servers收到client的确认后,也进入ESTABLISHED状态。

****************为什么client还要发送一次确认呢?主要是为了防止已失效的连接请求报文段突然又传送到了server,因而产生错误。**********************

二、TCP的连接释放(四次挥手)

如下图所示:

技术分享

释放连接过程:

    ①、数据传输结束后,通信的双方都可释放连接。现在client和server都处于ESTABLISHED状态。client的应用进程先向其TCP发出连接释放,并停止再发送数据,主动关闭TCP连接。client把连接释放报文段首部的FIN置1,其序号 seq=1021,它等于前面已传送过的数据的最后一个字节的序号加1.这是client进入FIN-WAIT-1(终止等待1)状态,等待server的确认。TCP规定,FIN报文段即使不携带数据,它也消耗一个序号。

    ②、server收到连接释放报文段后即发出确认,确认号是ack=1022,然后server就进入CLOSE-WAIT(关闭等待)状态。TCP服务器进程这时应通过高层应用进程,而从client到server这个方向的连接就释放了,这时的TCP连接处于半关闭(half-close)状态,即client已经没有数据要发送了,但server若发送数据,client仍要接收。也就是说server到client这个方向的连接并未关闭。

    ③、client收到来自server的确认后,就进入FIN-WAIT-2(终止等待2)状态,等待server发出的连接释放报文段。若server已经没有要向client发送的数据,其应用进程就通知TCP 释放连接。这是B发出的连接释放报文段必须使FIN=1 。现假定server的序号为8011.这是server就进入LAST-ACK(最后确认状态),等待client的确认。

    ④、client在收到server的连接释放报文段后,必须对此发出确认,在确认报文段中把ACK置1 ,序号为8012,然后进入到TIME-WAIT(时间等待)状态。这时候TCP连接还没有释放掉。必须经过时间等待计时器设置的时间2MSL后,client才进入到CLOSE状态。时间MSL叫做最长报文段寿命,建议设置为2分钟。

    ⑤、server接收到了client发出的确认,就进入CLOSED状态。

**************为什么client在TIME-WAIT状态必须等待2MSL时间呢?**********

    第一,为了保证client发送的最后一个ACK报文段能够到达server。

    第二,防止“已失效的连接请求报文段”出现在本连接中。

三、TCP有限状态基

    技术分享

每个方框中的大写英文字符串是TCP标准所使用的TCP连接状态名。状态之间的箭头表示可能发生的状态变迁。箭头旁边的字,表明引起这种变迁的原因,或表明发生状态变迁后又出现什么动作。图中三种不同的箭头表示的意义不同,粗实箭头表示对客户进程的正常变迁,粗虚箭头表示对服务器进程的正常变迁。另外一种细线箭头表示异常变迁。

    ①、CLOSED 状态时初始状态。

    ②、LISTEN:被动打开,服务器端的 状态变为LISTEN(监听)

    ③、SYN-RECVD:服务器端收到SYN后,状态为SYN;发送SYN ACK;

    ④、SYN_SENTY:应用程序发送SYN后,状态为SYN_SENT;

    ⑤、ESTABLISHED:当连接已经建立,客户端进入ESTABLISHED状态,服务器端收到客户端的确认后,服务器端也进入ESTABLISHED状态。

     ⑥、FIN_WAIT_1:应用程序端发送FIN,准备断开TCP连接

    ⑦、CLOSE_WAIT:服务器端在收到FIN后,发送ACK,状态为CLOSE_WAIT

    ⑧、FIN_WAIT_2:当客户端收到来自服务器端的确认后,就进入FIN_WAIT_2.

    ⑨、LAST_ACK:当服务器端没有要向客户端发送的数据,其应用进程就通知TCP释放连接。服务器端重复上次已发送过得确认号。这时服务器端就进入LAST_ACK状态。

    10、TIME_WAIT:客户端收到服务器端的连接释放报文段后,对此发出确认,然后客户端就进入了TIME_WAIT状态。

TCP协议的建立与释放及TCP的有限状态基

标签:tcp创建连接释放连接   状态基   

原文地址:http://9195095.blog.51cto.com/9185095/1774460

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!