首页 > 编程知识 正文

tcp三次握手和四次挥手的全过程,三次握手方法用于( )

时间:2023-05-06 02:59:48 阅读:174400 作者:737

TCP协议概述TCP提供面向连接的通信传输,需要在传输数据之前建立连接,并在数据传输完成后释放连接。 在两个方向上向另一方发送数据之前,必须在双方之间建立连接。 在TCP/IP协议中,TCP协议提供可靠的连接服务,连接通过三次握手初始化。 此外,TCP协议是面向连接、基于字节流的传输层通信协议,TCP处于全双工模式,因此必须挥手关闭连接。 TCP数据包报头在前面的学习中,我们知道当我们的数据进入传输层时,我们需要在原始数据字段之前添加TCP报头来形成数据包。 最初的结构由协议的具体规范详细定义。 数据包的开头明确地显示了协议应该如何读取数据。 相反,看头部就能够知道该协议所需的信息和应处理的数据。 包的头像协议的脸。

下面的图是TCP头部的规范定义,它定义了TCP协议如何读取和解析数据:

TCP首先在这个TCP协议上登载必要的信息,然后分析一下。

TCP端口号

TCP连接需要四个要素来确定唯一的连接。

(源IP,源端口号)+ (目地IP,目的端口号)

因此,TCP报头保留两个16位作为端口号的存储,IP地址由更高级别的IP协议传递

源端口号和目的地端口分别为16比特2字节,即端口的范围为2^16=65535

此外,1024以下为系统保留,1024-65535开始为用户使用的端口范围

TCP的序号和确认号:

33558 www.Sina.com/sequence number缩写seq、TCP通信中的某个传输方向上的字节流的每个字节的序列号、由此确认发送数据为顺序。 例如,当前序列号为1000,发送1000,并且下一个序列号为2000。

33558 www.Sina.com/acknowledge number缩写ack、TCP用于响应TCP段,向接收到的TCP段的编号seq加1以对上次的seq编号进行确认。

32位序号 seq:

每个TCP段都有一个目的。 这是使用TCP标志位选项确定的,发送方或接收方指定使用哪个标志,以便在另一端正确处理段。

的最广泛使用的标记是32位确认号 ack:,用于建立连接,确认成功的段传输,最后结束连接。

syn (简称为s ),同步用于建立会话连接的同步标志位、序列号。 建议连接,设置为1;

ACK )简称.确认标志位,确认接收到的数据包;

简称fin:f,完成标志位,表示我已经没有要发送的数据了,即将关闭连接;

PSH )简称p,推送标志位。 这指示该分组在被另一端接收之后立即传递到上层APP应用,而不在缓冲器中;

简称为RST:r,用于复位复位标志位,复位,连接错误拒绝、不正确的包;

URG )缩写为u,紧急标志位。 表示数据包的紧急指针字段是有效的,用于确保连接没有被切断,催促中间装置尽快处理。

握三次手

TCP的标志位Client将标志位SYN设置为1,随机生成值seq=J并将其发送给服务器,Client进入SYN_SENT状态,等待服务器确认。

SYN,ACK 和 FINServer在收到包后,从标志位SYN=1得知Client请求建立连接,Server将标志位SYN和ACK都设定为1,ack=J 1

(1)第一次握手:Client收到确认后,检查ack是否为J 1,将标志位ack正确设定为1时,ack=K 1,将该数据包发送到服务器

由于4次手势在TCP连接时是全双工的,所以各个方向必须分别关闭。 这个原则是在一方完成数据传输任务之后发送FIN以终止该方向的连接。 接收FIN只意味着数据不再沿那个方向流动,而在这个TCP连接中,FIN也可以沿那个方向发送。 首先要关闭的一侧执行主动关闭,另一侧执行被动关闭。 如上图所述,变成这样。

(1)第一次挥手)客户端发送用于关闭C-S的数据传输的FIN,客户端成为FIN_WAIT_1状态。

)第二次挥手) Server收到FIN后,向客户端发送ACK,确认序列号与接收号1(syn相同,一个FIN占用一个序列号,Server进入CLOSE_WAIT状态

(3)第三次挥手) Server发送关闭的FIN

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

常见面试题 【问题1】为什么连接的时候是三次握手,关闭的时候却是四次握手?

答:因为当Server端收到Client端的SYN连接请求报文后,可以直接发送SYN+ACK报文。其中ACK报文是用来应答的,SYN报文是用来同步的。但是关闭连接时,当Server端收到FIN报文时,很可能并不会立即关闭SOCKET,所以只能先回复一个ACK报文,告诉Client端,“你发的FIN报文我收到了”。只有等到我Server端所有的报文都发送完了,我才能发送FIN报文,因此不能一起发送。故需要四步握手。

【问题2】为什么TIME_WAIT状态需要经过2MSL(最大报文段生存时间)才能返回到CLOSE状态?

答:虽然按道理,四个报文都发送完毕,我们可以直接进入CLOSE状态了,但是我们必须假象网络是不可靠的,有可以最后一个ACK丢失。所以TIME_WAIT状态就是用来重发可能丢失的ACK报文。在Client发送出最后的ACK回复,但该ACK可能丢失。Server如果没有收到ACK,将不断重复发送FIN片段。所以Client不能立即关闭,它必须确认Server接收到了该ACK。Client会在发送出ACK之后进入到TIME_WAIT状态。Client会设置一个计时器,等待2MSL的时间。如果在该时间内再次收到FIN,那么Client会重发ACK并再次等待2MSL。所谓的2MSL是两倍的MSL(Maximum Segment Lifetime)。MSL指一个片段在网络中最大的存活时间,2MSL就是一个发送和一个回复所需的最大时间。如果直到2MSL,Client都没有再次收到FIN,那么Client推断ACK已经被成功接收,则结束TCP连接。

【问题3】为什么不能用两次握手进行连接?

答:3次握手完成两个重要的功能,既要双方做好发送数据的准备工作(双方都知道彼此已准备好),也要允许双方就初始序列号进行协商,这个序列号在握手过程中被发送和确认。
现在把三次握手改成仅需要两次握手,死锁是可能发生的。作为例子,考虑计算机S和C之间的通信,假定C给S发送一个连接请求分组,S收到了这个分组,并发 送了确认应答分组。按照两次握手的协定,S认为连接已经成功地建立了,可以开始发送数据分组。可是,C在S的应答分组在传输中被丢失的情况下,将不知道S 是否已准备好,不知道S建立什么样的序列号,C甚至怀疑S是否收到自己的连接请求分组。在这种情况下,C认为连接还未建立成功,将忽略S发来的任何数据分 组,只等待连接确认应答分组。而S在发出的分组超时后,重复发送同样的分组。这样就形成了死锁。

【问题4】如果已经建立了连接,但是客户端突然出现故障了怎么办?

TCP还设有一个保活计时器,显然,客户端如果出现故障,服务器不能一直等下去,白白浪费资源。服务器每收到一次客户端的请求后都会重新复位这个计时器,时间通常是设置为2小时,若两小时还没有收到客户端的任何数据,服务器就会发送一个探测报文段,以后每隔75秒钟发送一次。若一连发送10个探测报文仍然没反应,服务器就认为客户端出了故障,接着就关闭连接。

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。