ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

TCP连接的建立与终止

2021-01-31 12:29:14  阅读:165  来源: 互联网

标签:ACK 主机 报文 TCP 序号 终止 连接


1. TCP的建立

 设主机B运行一个服务器进程,它先发出一个被动打开命令,告诉它的TCP要准备接收客户进程的连续请求,然后服务进程就处于听的状态。不断检测是否有客户进程发起连续请求,如有,作出响应。设客户进程运行在主机A中,他先向自己的TCP发出主动打开的命令,表明要向某个IP地址的某个端口建立运输连接,过程如下:

     1)主机A的TCP向主机B的TCP发出连接请求报文段,其首部中的同步比特SYN应置1,同时选择一个序号x,表明在后面传送数据时的第一个数据字节的序号是x

     2)主机B的TCP收到连接请求报文段后,如同意,则返回确认。在确认报文段中应将SYN置为1,确认号应为x+1,同时也为自己选择一个序号y。

     3)主机A的TCP收到此报文段后,还要向B给出确认,其确认号为y+1

     4)主机A的TCP通知上层应用进程,连接已经建立,当主机B的TCP收到主机A的确认后,也通知上层应用进程,连接建立。

2. TCP正常终止

在数据传输完毕之后,通信双方都可以发出释放连接的请求。释放连接的过程为如上图所示:

     1)数据传输结束后,主机A的应用进程先向其TCP发出释放连接请求,不在发送数据。TCP通知对方要释放从A到B的连接,将发往主机B的TCP报文段首部的终止比特FIN置为1序号u等于已传送数据的最后一个字节的序号加1

     2)主机B的TCP收到释放连接通知后发出确认,其序号为u+1,同时通知应用进程,这样A到B的连接就释放了,连接处于半关闭状态。主机B不在接受主机A发来的数据;但主机B还向A发送数据,主机A若正确接收数据仍需要发送确认。

     3)在主机B向主机A的数据发送结束后,其应用进程就通知TCP释放连接。主机B发出的连接释放报文段必须将终止比特置为1并使其序号w等于前面已经传送过的数据的最后一个字节的序号加 1还必须重复上次已发送过的ACK=u+1。

     4)主机A对主机B的连接释放报文段发出确认,将ACK置为1,ack=w+1, seq=u+1。这样才把从B到A的反方向连接释放掉,主机A的TCP再向其应用进程报告,整个连接已经全部释放。

3. TIME_WAIT(2MSL)的意义

MSL(Maximum segment Lifetime):报文最大生存时间,它是任何报文在网络上存在的最长时间,超过这个时间报文将被丢弃。

RFC 793中规定MSL为2分钟,实际常用的是30秒、1分钟和2分钟等。

当TCP的一端发起主动关闭,在发出最后一个ACK包后,即第三次握手完成后发送了第四次握手的ACK包后进入TIME_WAIT状态,必须在此状态上停留两倍的MSL时间,主要目的是怕最后一个ACK包对方没有收到,对方在超时后将重发第三次握手的FIN包,主动关闭端接到重发的FIN包后可以再发一个ACK应答包。在TIME_WAIT状态时两端的端口不能使用,要等到2MSL时间结束后才可以继续使用。当连接处于2MSL等待阶段时任何迟到的报文都将被丢弃。实际使用中通过设置SO_REUSEADDR选项可以不必等待2MSL时间结束后再使用此端口。

如果主动关闭方没有TIME_WAIT,而是立即关闭连接。对方由于没有收到ACK而重发了FIN包,报文到达主动方时,由于连接已经不存在,主动方会回复一个RST包给被动关闭方,被动关闭方如果收到RST包后继续往此连接写数据,就会报错了。

标签:ACK,主机,报文,TCP,序号,终止,连接
来源: https://blog.csdn.net/www_dong/article/details/113464241

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有