首页 > 编程知识 正文

tcp/ip三次握手四次挥手超详细,tcp四次挥手可以变成三次吗

时间:2023-05-03 11:37:47 阅读:27011 作者:1479

什么是TCP/IP协议? TCP、传输控制协议(Transmission Control Protocol )是基于面向连接、可靠的字节流的传输层通信协议。 TCP旨在支持支持多网络APP应用的分层协议层。 在连接到不同但互连的计算机通信网络的主计算机中,依赖于TCP来提供可靠的通信服务。

IP是互联网协议的缩写。 IP的设计目的是提高网络的可扩展性。 一是解决互联网问题,实现大规模异构网络互联。 二是划分顶层网络APP应用与底层网络技术的耦合关系,有利于两者的独立发展。 根据端到端设计原则,IP只提供无主机连接、不可靠、尽力而为的分组传输服务。

TCP/IP协议不仅仅是两种协议: TCP和IP。 在许多情况下,IP或ICMP、TCP或UDP、TELNET或FTP以及HTTP等属于TCP/IP协议。 他们与TCP和IP关系密切,是互联网不可缺少的组成部分。 因为术语TCP/IP是指这些协议,所以TCP/IP有时也被称为因特网协议组。 在网上通信需要相应的网络协议,而TCP/IP原本就是为使用互联网而开发制定的协议家族。 因此,互联网的协议是TCP/IP。

2. TCP和UDP TCP/IP有两种典型的传输层协议: TCP和UDP。 两者具有以下特征。

(1) TCP是面向连接的,并且udp不需要连接,即在发送数据之前建立链路。

)2) TCP提供可靠的服务。 也就是说,通过TCP连接传输的数据按顺序到达,无错误、无丢失、不重复; UDP尽最大努力交货。 也就是说,不保证可靠的交货。 另外,tcp可靠、面向连接、不会丢失数据,因此适用于大数据量的交换。

)3) TCP是面向字节流的,UDP是面向消息的,并且即使发生网络拥塞也不会降低发送速度(因此会发生丢包,对应于实时APP应用,如IP电话、视频会议等)。

)4) TCP只能一对一,UDP支持一对一、一对多。

)5) TCP的开头较大,为20字节,UDP只有8字节。

)6) TCP是面向连接的可靠传输,UDP是不可靠传输。

3.3次握手(Three-way Handshake )实际上是指在建立TCP连接时,客户端和服务器必须发送总共三个数据包。 三次握手的主要作用是检查双方的接收能力和发送能力是否正常,并指定自己的初始化序列号,为以后的可靠传输做准备。 实际上,它连接到服务器并指定端口,建立TCP连接,同步连接两个序列号和确认号,并交换TCP窗口大小信息。

最初客户端处于关闭状态,服务端处于侦听状态。

第一次握手:客户端向服务端发送SYN消息,指示客户端的初始化序列号ISN。 此时客户端为SYN_SENT状。 开头的同步位SYN=1、初始序号seq=x、SYN=1的消息段中虽然不能携带数据,但是消耗一个序号。

第二次握手:服务器从客户端接收到SYN消息后,将自己的SYN消息作为响应并指定自己的初始化序列号ISN(s )。 另外,客户机的ISN 1被设置为ACK的值,表示自己从客户机接收到SYN,此时,服务器处于SYN_RCVD的状态。 在确认消息段中,SYN=1、ACK=1、确认号ack=x 1、初始号seq=y。

第三次握手:客户端收到SYN消息后发送ACK消息。 当然,同样将服务器的ISN 1作为ACK的值,表示收到了服务端的SYN消息。 此时,客户端处于ESTABLISHED状态。 服务器收到ACK消息后进入ESTABLISHED状态,此时双方已经建立连接。

消息段ACK=1、确认号ACK=y 1、序列号seq=x 1 (因为初始是seq=x,第二个消息段,所以1 ),ack消息段可以携带数据,必须携带数据

发送第一个SYN的一侧执行主动打开,接收此SYN并发送回下一个SYN的一侧执行被动打开。

在套接字编程中,客户端运行connect )时,会触发三次握手。

4.4挥手4次结束TCP连接意味着,在断开一个TCP连接时,客户端和服务端需要发送共计4个数据包来确认连接的断开。 在套接字编程中,此进程是由客户端或服务端运行关闭而触发的。

因为TCP连接是全双工的,所以每个方向都必须单独关闭。 它的原则是在一方完成数据发送任务后,发送FIN以终止此方向的连接。 接收FIN意味着数据不再沿此方向流动,也就是说不再接收数据,但此TCP连接也可以沿此方向发送FIN。 首先关闭的一方执行主动关闭,另一方执行被动关闭。

第一次挥手时:客户端发送FIN=M,关闭客户端到服务器的数据传输,客户端访问

FIN_WAIT_1状态。意思是说"我客户端没有数据要发给你了",但是如果你服务器端还有数据没有发送完成,则不必急着关闭连接,可以继续发送数据。 

                                
第二次挥手:服务器端收到FIN后,先发送ack=M+1,告诉客户端,你的请求我收到了,但是我还没准备好,请继续你等我的消息。这个时候客户端就进入FIN_WAIT_2 状态,继续等待服务器端的FIN报文。


第三次挥手:当服务器端确定数据已发送完成,则向客户端发送FIN=N报文,告诉客户端,好了,我这边数据发完了,准备好关闭连接了。服务器端进入LAST_ACK状态。


第四次挥手:客户端收到FIN=N报文后,就知道可以关闭连接了,但是他还是不相信网络,怕服务器端不知道要关闭,所以发送ack=N+1后进入TIME_WAIT状态,如果Server端没有收到ACK则可以重传。服务器端收到ACK后,就知道可以断开连接了。客户端等待了2MSL后依然没有收到回复,则证明服务器端已正常关闭,那好,我客户端也可以关闭连接了。

最终完成了四次握手。

参考 & 感谢:

原文链接:https://blog.csdn.net/hyg0811/article/details/102366854

原文链接:https://www.jianshu.com/p/9f3e879a4c9c

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