ICode9

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

TCP连接和释放

2022-05-10 14:35:57  阅读:198  来源: 互联网

标签:释放 报文 确认 TCP 序号 连接 客户端


TCP是面向连接的协议,运输连接用于传送TCP报文,TCP的运输连接包括三个阶段:连接建立、数据传送和连接释放。

TCP连接

TCP建立连接的过程叫做握手,握手需要在客户端和服务器之间交换三个TCP报文段。将TCP连接称为“三次握手”是不严谨的,应该是在一次握手的过程中交换了三个TCP报文。

假设主机A运行的是TCP客户程序,B运行的是TCP服务器程序。最初两端的TCP进程都处于CLOSED状态。

当客户端需要发送请求时,主动打开连接,A的TCP客户进程首先创建传输控制模块TCB,向B发送连接请求报文段,此时TCP报文首部的同步位SYN=1,同时选择一个初始序号seq=x。(TCP协议规定,SYN报文段不能携带数据,但要消耗掉一个序号)此时,A进入SYN-SENT(同步已发送)阶段。

B收到连接请求报文段后,如同意建立连接,则向A发送确认,确认报文段中SYN位和ACK位都置1,确认号是ack=x+1,自己的初始序号seq=y。这时,TCP服务器进程进入SYN-RCVD(同步收到)状态。

A收到B的确认后,还要给B确认。ACK置1,确认号ack=y+1,自己的序号seq=x+1。(ACK报文段可以携带数据,如果不携带数据则不消耗序号,下一个数据报文段的序号仍然是seq=x+1)此时,TCP连接建立,A进入ESTABLISTENED(已建立连接)状态。

B收到A的确认,也进入ESTABLISTENED状态。

问题:为什么是三报文握手而不是两报文握手?

主要是为了防止已失效的连接请求报文段突然又传送到了B:A发出连接请求,但因连接请求报文丢失而未收到确认,于是A再一次重传连接请求,后来A收到了确认,建立了连接。假如A第一次连接请求的报文段并没有丢失,而是在某网络结点长时间滞留了,以致延误到连接释放以后的某个时间才到达B。B收到此失效的连接请求报文段后,就误认为是A又发出的一次新的连接,于是就向A发出确认报文段,同意建立连接。假定不采用报文握手,只要B发出确认,新的连接就建立了。而此时A并没有发出建立连接的请求,B却一直等待A发送数据,就会浪费B的资源。

TCP释放

TCP释放的过程我们可以称为四次挥手。

第一次挥手:由客户端A向服务器发送连接释放请求,此时,A的TCP报文首部的终止控制位FIN=1,序号seq=u(TCP规定,FIN报文段即使不携带数据,也要消耗一个序号)。A进入FIN-WAIT1状态。

第二次挥手:B收到A的连接释放请求后,向A发送一个确认报文,确认号ack=u+1,这个报文自己的序号seq=v(=B之前传送的数据的最后一个字节的序号+1),此时TCP连接处于半关闭状态,即A没有数据要发送,但B若发送数据,A仍要接收。A进入FIN-WAIT2状态,等待B发出的连接释放报文段。

第三次挥手:B没有要向A发送的数据之后,其应用进程就会通知TCP释放连接,此时B发送FIN报文,假定B的序号seq=w(半关闭状态B又发送了一些数据),B重复上一次的确认号ack=u+1。此时B进入LAST-ACK状态,等待A的确认。

第四次挥手:客户端收到连接释放报文段之后,必须发出确认:ACK=1,seq=u+1,ack=w+1。 再经过2MSL(最长报文端寿命)后,本次TCP连接真正结束。

问题:在结束连接的过程中,为什么在收到服务器端的连接释放报文段之后,客户端还要继续等待2MSL之后才真正关闭TCP连接呢?

第一个是:需要保证服务器端收到了客户端的最后一条确认报文。假如这条报文丢失,服务器没有接收到确认报文,就会对连接释放报文进行超时重传,而此时客户端连接已关闭,无法做出响应,就造成了服务器端不停重传连接释放报文,而无法正常进入关闭状态的状况。而等待2MSL,就可以保证服务器端收到了最终确认;若服务器端没有收到,那么在2MSL(最长报文段寿命)之内客户端一定会收到服务器端的重传报文,此时客户端就会重传确认报文,并重置计时器。

第二个是:存在一种“已失效的连接请求报文段”,需要避免这种报文端出现在本连接中,造成异常。
A在发送完最后一个ACK报文段之后,再经过2MSL,就可以使本连接持续时间内产生的所有报文都从网络中消失,这样就可以使下一个新的连接中不会出现这种旧的连接请求报文段。

标签:释放,报文,确认,TCP,序号,连接,客户端
来源: https://www.cnblogs.com/JJuan/p/16253379.html

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

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

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

ICode9版权所有