TCP的三次握手与四次挥手

这篇具有很好参考价值的文章主要介绍了TCP的三次握手与四次挥手。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

参考文章:https://blog.csdn.net/qq_38950316/article/details/81087809


1、TCP头部结构

在介绍三次握手与四次挥手之前我们先来了解一下TCP的头部结构是什么样的。

TCP头部的最大长度为60字节,其中包括TCP报文固定长度20字节+可变字节(最大40字节),具体结构如下:

TCP的三次握手与四次挥手
在认识三次握手与四次挥手之前我们必须要直到以下字段及含义:

  • 序号seq,占32位,用来标识从发送端到接收端发送的字节流。
  • 确认号ack,占32位,只有ACK标志位为1时,确认序号字段才有效,ack=seq+1
  • 标志位
    • SYN:发起一个新连接。
    • FIN:释放一个连接。
    • ACK:确认序号有效。

在学习三次握手四次挥手后我们需要能流畅描述三次握手的流程及其中的字段含义作用的同时还需要记住每次握手时接收端和发送端的状态

2、三次握手

在三次握手中发送端有CLOSEDSYN-SENTESTABLISHED三种状态,接收端有CLOSEDLISTENSYN-RCVDESTABLISHED四种状态。

三次握手过程如下图:

TCP的三次握手与四次挥手
假设发送端为客户端,接收端为服务端。开始时客户端和服务端的状态都是CLOSE

  • 第一次握手:客户端向服务端发起建立连接请求客户端会随机生成一个起始序列号x,客户端向服务端发送的字段中包含标志位SYN=1序列号seq=x
  • 第一次握手前客户端的状态为CLOSE第一次握手后:客户端的状态为SYN-SENT(等待一个匹配的连接请求),此时服务端的状态为LISTEN(等待从任何远端TCP 和端口的连接请求)。
  • 第二次握手:服务端在收到客户端发来的报文后,会随机生成一个服务端起始序列号y,然后给客户端回复一段报文,其中包括标志位SYN=1ACK=1序列号seq=y确认号ack=x+1
  • 第二次握手前服务端的状态为LISTEN第二次握手后服务端的状态为SYN-RCVD(等待连接请求确认),此时客户端的状态为
    SYN-SENT
  • 第三次握手:客户端收到服务端发来的报文后,会再向服务端发送报文,其中包含标志位ACK=1序列号seq=x+1确认号ack=y+1
  • 第三次握手前客户端的状态为SYN-SENT第三次握手后客户端和服务端的状态都为ESTABLISHED(表示一个打开的连接,接收到的数据可以被投递给用户)。

需要注意的一点是:

  1. 第一次握手,客户端向服务端发起建立连接报文,会占一个序列号。
  2. 但是第三次握手,同样是客户端向服务端发送报文,这次却不占序列号.
  3. 所以建立连接后,客户端向服务端发送的第一个数据的序列号为x+1。

3、四次挥手

客户端在四次挥手过程中有ESTABLISHEDFIN-WAIT-1FIN-WAIT-2TIME-WAITCLOSED等五个状态,服务端有ESTABLISHEDCLOSE-WAITLAST-ACKCLOSED等四种状态。

四次挥手过程如下图:

TCP的三次握手与四次挥手
假设客户端首先发起的断开连接请求

  • 第一次挥手:客户端向服务端发送的数据完成后,向服务端发起释放连接报文,报文包含标志位
    FIN=1序列号seq=u。此时客户端只能接收数据,不能向服务端发送数据。
  • 第二次挥手:服务端收到客户端的释放连接报文后,向客户端发送确认报文,包含标志位ACK=1序列号seq=v确认号ack=u+1。此时客户端到服务端的连接已经释放掉,客户端不能像服务端发送数据,服务端也不能向客户端发送数据。但服务端到客户端的单向连接还能正常传输数据。
  • 第三次挥手:服务端发送完数据后向客户端发出连接释放报文,报文包含标志位FIN=1标志位ACK=1序列号seq=w确认号ack=u+1
  • 第四次挥手:客户端收到服务端发送的释放连接请求,向服务端发送确认报文,包含标志位ACK=1序列号seq=u+1确认号ack=w+1

4、为什么TCP连接的时候是三次?两次是否可以?

答:不可以,主要从以下两方面考虑(假设客户端是首先发起连接请求):

  1. 假设建立TCP连接仅需要两次握手,那么如果第二次握手时,服务端返回给客户端的确认报文丢失了,客户端这边认为服务端没有和他建立连接,而服务端却以为已经和客户端建立了连接,并且可能服务端已经开始向客户端发送数据,但客户端并不会接收这些数据,浪费了资源。如果是三次握手,不会出现双方连接还未完全建立成功就开始发送数据的情况。
  2. 如果服务端接收到了一个早已失效的来自客户端的连接请求报文,会向客户端发送确认报文同意建立TCP连接。但因为客户端并不需要向服务端发送数据,所以此次TCP连接没有意义并且浪费了资源。

5、为什么TCP连接的时候是三次,关闭的时候却是四次?

答:因为需要确保通信双方都能通知对方释放连接

  1. 假设客户端发送完数据向服务端发送释放连接请求,当客户端并不知道,服务端是否已经发送完数据,所以此次断开的是客户端到服务端的单向连接
  2. 服务端返回给客户端确认报文后,服务端还能继续单向给客户端发送数据
  3. 当服务端发送完数据后还需要向客户端发送释放连接请求
  4. 客户端返回确认报文,TCP连接彻底关闭

所以断开TCP连接需要客户端和服务端分别通知对方并分别收到确认报文,一共需要四次。

6、TIME_WAIT和CLOSE_WAIT的区别在哪?

答:默认客户端首先发起断开连接请求,从上图可以看出:

  • CLOSE_WAIT是被动关闭形成的,当客户端发送FIN报文,服务端返回ACK报文后进入CLOSE_WAIT。
  • TIME_WAIT是主动关闭形成的,当第四次挥手完成后,客户端进入TIME_WAIT状态。

7、为什么客户端发出第四次挥手的确认报文后要等2MSL的时间才能释放TCP连接?

答:其中MSL的意思是报文的最长寿命,可以从两方面考虑:

  1. 客户端发送第四次挥手中的报文后,再经过2MSL,可使本次TCP连接中的所有报文全部消失,不会出现在下一个TCP连接中。
  2. 考虑丢包问题,如果第四挥手发送的报文在传输过程中丢失了,那么服务端没收到确认ack报文就会重发第三次挥手的报文。如果客户端发送完第四次挥手的确认报文后直接关闭,而这次报文又恰好丢失,则会造成服务端无法正常关闭

可靠的实现TCP全双工连接的终止;
允许老的重复分节在网络中消逝。

8、如果已经建立了连接,但是客户端突然出现故障了怎么办?

答:如果TCP连接已经建立,在通信过程中,客户端突然故障,那么服务端不会一直等下去,过一段时间就关闭连接了。具体原理是TCP有一个保活机制,主要用在服务器端,用于检测已建立TCP链接的客户端的状态,防止因客户端崩溃或者客户端网络不可达,而服务器端一直保持该TCP链接,占用服务器端的大量资源(因为Linux系统中可以创建的总TCP链接数是有限制的)。

保活机制原理:设置TCP保活机制的保活时间keepIdle,即在TCP链接超过该时间没有任何数据交互时,发送保活探测报文;设置保活探测报文发送时间间隔keepInterval;设置保活探测报文的总发送次数keepCount。如果在keepCount次的保活探测报文均没有收到客户端的回应,则服务器端即关闭与客户端的TCP连接

9、三次握手过程中可以携带数据吗?

答:第三次握手的时候可以携带数据的,第一次、第二次握手不可以携带数据。文章来源地址https://www.toymoban.com/news/detail-406158.html

  • 假如第一次握手可以携带数据的话,如果有人要恶意攻击服务器,那他每次都在第一次握手中的 SYN 报文中放入大量的数据,然后疯狂着重复发 SYN 报文的话,这会让服务器花费很多时间、内存空间来接收这些报文。也就是说,第一次握手不可以放数据,其中一个简单的原因就是会让服务器更加容易受到攻击了
  • 第一次、第二次握手都有SYN报文所以第一次、第二次握手都不可以携带数据。
  • 而对于第三次的话,此时客户端已经处于 ESTABLISHED 状态。对于客户端来说,他已经建立起连接了,并且也已经知道服务器的接收、发送能力是正常的了,所以能携带数据也没啥毛病。

10、各种状态的含义

  • CLOSED:不在连接状态(这是为方便描述假想的状态,实际不存在)
  • LISTEN:等待从任何远端TCP 和端口的连接请求。
  • SYN_SENT:发送完一个连接请求后等待一个匹配的连接请求。
  • SYN_RCVD:发送连接请求并且接收到匹配的连接请求以后等待连接请求确认。
  • ESTABLISHED:表示一个打开的连接,接收到的数据可以被投递给用户。连接的数据传输阶段的正常状态。
  • FIN_WAIT_1:等待远端TCP 的连接终止请求,或者等待之前发送的连接终止请求的确认。
  • CLOSE_WAIT:等待本地用户的连接终止请求。
  • FIN_WAIT_2:等待远端TCP 的连接终止请求。
  • LAST_ACK:等待先前发送给远端TCP 的连接终止请求的确认(包括它字节的连接终止请求的确认)。
  • CLOSING:等待远端TCP 的连接终止请求确认。
  • TIME_WAIT:等待足够的时间过去以确保远端TCP 接收到它的连接终止请求的确认。

到了这里,关于TCP的三次握手与四次挥手的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 深入解析:HTTP和HTTPS的三次握手与四次挥手

    推荐阅读 字数统计:约 571 字 预计阅读时间:约 3 分钟 引言 在网络通信中,HTTP和HTTPS是两个最为常见的协议,它们作为应用层协议,扮演着浏览器与服务器之间传输数据的关键角色。而在建立和终止网络连接时,三次握手和四次挥手是不可或缺的步骤。本文将深入解析HTT

    2024年02月12日
    浏览(43)
  • 深入理解TCP三次握手与四次挥手过程以及抓包实验

    最近,我正好在做socket相关的实验,发现现在对计算机网络知识有一点点模糊,借此机会,熟悉一下TCP连接过程并利用WireShark工具进行测试。 源端口号:占16比特,写入源端口号,用来 标识发送该TCP报文段的应用进程。 目的端口号:占16比特,写入目的端口号,用来 标识接

    2024年02月08日
    浏览(44)
  • TCP的三次握手、四次挥手

    首先我们要知道建立连接的目的是什么,我们是为了可靠的传输数据。那既然是可靠的传输数据,我们必须保证客户端和服务端都能正常的发送和接收数据,如果某一方不能正常的发送或者接收数据,那整个数据的传输就不能成功,也就不可靠。 三次握手 1.第一次握手:第一

    2024年02月10日
    浏览(45)
  • TCP的三次握手,四次挥手

    第一次握手:客户端发送SYN报文,井发送seq为x序列号给服务端,等待服务端的确认 第二次握手:服务端发送SYN+ACK报文,并发送seq为Y的序列号,在确认序列号为x+1 第三次握手:客户端发送ACK报文,并发送seq序列号为z,在确认序列号为y+1 第一次挥手:先由客户端向服务器端发

    2024年01月18日
    浏览(76)
  • TCP的三次握手四次挥手

    TCP的三次握手和四次挥手实质就是TCP通信的连接和断开。 三次握手:为了对每次发送的数据量进行跟踪与协商,确保数据段的发送和接收同步,根据所接收到的数据量而确认数据发送、接收完毕后何时撤消联系,并建立虚连接。 四次挥手:即终止TCP连接,就是指断开一个T

    2024年02月11日
    浏览(46)
  • TCP 的三次握手和四次挥手

    Java 面试题 第一次握手 :客户端向服务端发送SYN包。报文中标志位SYN=1,序列号seq=x(x为随机整数)。此时客户端进入了  SYN_SEND 同步已发送状态。 第二次握手 :服务端回复客户端SYN+ACK包。报文中标志位SYN=1,标志位ACK=1,序列号seq=y(y为随机整数),确认号ack=x+1(x为客户

    2024年01月20日
    浏览(55)
  • TCP的三次握手和四次挥手

    既然我们文章要说的是TCP的三次握手,和四次挥手,那么肯定是说的连接,也不是说的不其他的。那么它这个连接的过程说的是什么呢? 我们还是从图中理解,这样比较好理解, TCP第一次握手:服务端的TCP进程先创建传输控制块TCB,准备接受客户端进程的连接请求,然后服

    2024年02月01日
    浏览(52)
  • TCP中的三次握手和四次挥手

    TCP中的连接和断开可以说是在面试中经常被问到的问题之一,正好有空就总结一下,首先回顾一下TCP的相关知识点 1.1 TCP的基本概念 我们知道TCP是运输层的面向连接的可靠的传输协议。 面向连接的 ,指的就是在两个进程发送数据之前,必须先相互“握手”,确保两进程可以

    2024年02月03日
    浏览(51)
  • TCP的三次握手,四次挥手,面试必会

    目录 一、TCP三次握手(建立连接) 二、TCP三次握手细节 三、TCP(四次挥手)断开连接 四、TCP非常重要的协议 🤝🤝握手,单纯就是发一个打招呼的数据,不携带业务信息 那么为什么叫三次握手呢,因为B的中间两次可以合并成一次。 为什么我们要合并呢?💫💫 因为我们的

    2024年02月09日
    浏览(48)
  • TCP的三次握手和四次挥手······详解

    三次握手是 建立连接 的过程 如图大致为三次握手的流程图: 当客户端对服务端发起连接时,会 先发一个包 连接请求数据,去询问能否建立连接,该数据包称为 “SYN”包 然后,如果对方同意连接,那么对方将会回复一个 “SYN+ACK”包 客户端收到后,回复一个 “ACK”包 ,连

    2024年02月09日
    浏览(42)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包