1、TCP的连接创建(三次握手)服务器
以下图所示:假定最初两端的TCP进程都处于关闭状态。下图中,client主动打开连接,server被动打开连接ide
建立过程:spa
①、server的TCP服务器进程先建立传输控制块TCB(存储了每个连接中的重要信息),准备接受client进程的链接请求。而后服务器进程就处于LISTEN(收听)状态,等待客户的链接请求。若有,做出响应。
server
②、client的TCP客户进程也是首先建立传输控制模块TCB,而后向server发出链接请求报文段,这时首部中的同步位SYN =1,同时选择一个初始序号 seq =1000,TCP规定,SYN报文段不能携带数据,但要消耗一个序号。这时,TCP客户进程进入SYN-SENT(同步以发送)状态。mss表示最大段尺寸,blog
若是一个段太大,封装成帧后超过了链路层的最大帧长度,就必须在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(已创建链接)状态。
get
⑤、当servers收到client的确认后,也进入ESTABLISHED状态。同步
****************为何client还要发送一次确认呢?主要是为了防止已失效的链接请求报文段忽然又传送到了server,于是产生错误。**********************it
2、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。
第二,防止“已失效的链接请求报文段”出如今本链接中。
3、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状态。
十、TIME_WAIT:客户端收到服务器端的链接释放报文段后,对此发出确认,而后客户端就进入了TIME_WAIT状态。