栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

TCP/IP三次握手四次挥手

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

TCP/IP三次握手四次挥手

TCP是一种面向连接的、可靠的、基于字节流的传输层通信协议,在发送数据前,通讯双方必须在彼此间建立一条连接。所谓的“连接”,其实就是客户端和服务端保存的一份关于对方的信息,如ip地址、端口号等。

TCP可以看成是一种字节流,它会处理IP层或以下层的丢包、重复以及错误问题。在连接的建立过程中,双方需要交换一些参数哦。这些参数可以放在TCP头部。

一个TCP连接由一个4元组构成,分别是两个IP地址和两个端口号。一个TCP连接通常分为三个阶段:连接、数据传输、退出(关闭)。通过三次握手来建立一个连接,通过四次挥手来关闭一个连接。

当一个连接被建立或者终止时,交换的报文段只包含TCP头部,而没有数据。

三次握手

三次握手的本质:确认通信双方收发数据的能力

首先,首先我让信使运输一份信件给对方,对方收到了,那么他知道了我发邮件的能力和他收邮件的能力。

于是他给我回信,我若收到了,我便得知我的发件能力和他的收件能力是可以的,并且他的发件能力和我的收件能力是可以的。

然而,此时的他还不知道他的发件能力和我的收件能力到底可不可以,于是我最后回馈一次,他若收到了,他便知道自己的发件能力和我的收件能力是可以的。

这就是三次握手。

  • 第一次握手:客户端要向服务端发起连接请求,首先客户端要随机生成一个序列号ISN(比如说是100),客户端向服务端发送的报文包含SYN标志位(SYN=1),序列号seq=100
  • 第二次握手:服务端受到客户端发送过来的报文后,发现SYN=1,知道这是一个连接的请求。于是将客户端的起始序列号100存起来,并且随机生成一个服务端的起始序列号(比如是300)。然后给客户端回复一段报文,回复包含(SYN=1,ACK=1)、序列号seq=300、确认号ack=101(客户端发送的序列号+1)
  • 第三次握手:客户端收到服务端的回复后发现ACK=1并且ack=101,于是知道服务端已经收到了序列号为100的那段报文,同时发现SYN=1,知道了服务端同意了这次连接,于是将服务端的序列号300给存起来。然后客户端回复一段报文给服务端,报文含ACK标志位(ACK=1),ack=301(300+1),seq=101(注意第一次握手时发送报文是占用一个序列号的,所以第三次握手的序列号是101,但是要注意的是不携带数据的ACK报文不占用序列号的,所以后面第一次正式发送数据时seq还是101)。当服务器收到报文发现ACK=1并且 seq=301,就知道客户端收到序列号为300的报文了,就这样客户端和服务端通过TCP建立了连接。
四次挥手

四次挥手的目的是关闭一个连接。

Q:为什么挥手是四次?

A:因为客户端发出FIN报文时只能说明客户端没有数据要发送了,但是此时可能服务端的数据还没有发完。所以首先服务端要给客户端一个报文表示自己以及收到服务端的FIN请求了。然后服务端继续进行数据发送,当数据完成时,客户端向服务端发送一个FIN报文,之后收到客户端的确认报文后,才会结束TCP连接。

比如客户端初始化的序列号ISA=100,服务端初始化的序列号ISA=300。TCP连接成功后客户端总共发送了1000个字节的数据,服务端在客户端发FIN报文前总共回复了2000个字节的数据。

  • 第一次挥手:当客户端的数据都传输完成后,客户端向服务端发出连接释放报文(当然数据没发完时也可以发送连接释放报文并停止发送数据),释放连接报文包含FIN标志位(FIN=1)、序列号seq=1101(100+1+1000,其中的1是建立连接时占的一个序列号)。需要注意的是客户端发出FIN报文段后只是不能发数据了,但是还可以正常收数据;另外FIN报文段即使不携带数据也要占据一个序列号。
  • 第二次挥手:服务端收到客户端发的FIN报文后给客户端回复确认报文,确认报文包含ACK标志位(ACK=1)、确认号ack=1102(客户端FIN报文序列号1101+1)、序列号seq=2300(300+2000)。此时服务端处于关闭等待状态,而不是立马给客户端发FIN报文,这个状态还要持续一段时间,因为服务端可能还有数据没发完。
  • 第三次挥手:服务端将最后数据(比如50个字节)发送完毕后就向客户端发出连接释放报文,报文包含FIN和ACK标志位(FIN=1,ACK=1)、确认号和第二次挥手一样ack=1102、序列号seq=2350(2300+50)。
  • 第四次挥手:客户端收到服务端发的FIN报文后,向服务端发出确认报文,确认报文包含ACK标志位(ACK=1)、确认号ack=2351、序列号seq=1102。注意客户端发出确认报文后不是立马释放TCP连接,而是要经过2MSL(最长报文段寿命的2倍时长)后才释放TCP连接。而服务端一旦收到客户端发出的确认报文就会立马释放TCP连接,所以服务端结束TCP连接的时间要比客户端早一些。

为什么第四次挥手后要等待2MSL?

考虑到丢包问题,如果第四次挥手报文丢失,服务端没有收到确认ACK的报文就会重新发送第三次挥手的报文,这样报文一去一回的最长时间就是2MSL,所以要等待这么长时间确定服务端确实收到客户端确认报文了。

 参考文献:

 卧槽!牛皮了,头一次见有大佬把TCP/IP三次握手四次挥手解释的这么明白 - 知乎原文:https://blog.csdn.net/ThinkWo...计算机网络体系结构在计算机网络的基本概念中,分层次的体系结构是最基本的。计算机网络体系结构的抽象概念较多,在学习时要多思考。这些概念对后面的学习很有帮助。 网络…https://zhuanlan.zhihu.com/p/141396896

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/937559.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号