http://521daxue.wikidot.com/hmwangduh https://vk.com/id690753581 https://vk.com/public209578729 https://vk.com/public209578716 https://vk.com/public209578706 https://vk.com/public209578700 https://vk.com/public209578693 https://vk.com/public209578677 https://vk.com/public209578671 https://vk.com/public209578660 https://vk.com/public209578655 https://vk.com/public209578647 https://vk.com/public209578639 https://vk.com/public209578620 https://vk.com/public209511857 https://vk.com/public209511580 https://vk.com/public209511287 https://vk.com/public209511116 https://vk.com/public209510911 https://vk.com/public209510773 https://vk.com/public209510425 https://vk.com/public209510300 https://vk.com/public209510020 https://vk.com/public209509912 https://vk.com/public209509711 https://vk.com/public209509707 https://vk.com/public209509699 https://vk.com/public209468344 https://vk.com/public209468335 https://vk.com/public209468320 https://vk.com/public209468312 https://vk.com/public209468304 https://vk.com/public209468299 https://vk.com/public209468293 https://vk.com/public209468283 https://vk.com/public209468271 https://vk.com/public209468261 https://vk.com/public209468250 https://vk.com/public209468240 https://vk.com/public209468230 https://vk.com/public209428688 https://vk.com/public209428684 https://vk.com/public209428672 https://vk.com/public209428669 https://vk.com/public209428665 https://vk.com/public209428661 https://vk.com/public209428659 https://vk.com/public209428656 https://vk.com/public209428653 https://vk.com/public209428651 https://vk.com/public209428646 https://vk.com/public209428641 https://vk.com/public209428633 https://vk.com/public209371893 https://vk.com/public209371887 https://vk.com/public209371877 https://vk.com/public209371858 https://vk.com/public209371852 https://vk.com/public209371841 https://vk.com/public209371834 https://vk.com/public209371813 https://vk.com/public209371826 https://vk.com/public209371802 https://vk.com/public209371790 https://vk.com/public209371780 https://vk.com/public209298957 https://vk.com/public209298947 https://vk.com/public209298934 https://vk.com/public209298926 https://vk.com/public209298917 https://vk.com/public209298875 https://vk.com/public209298871 https://vk.com/public209298862 https://vk.com/public209298719 https://vk.com/public209298858 https://vk.com/public209298843 https://vk.com/public209250048 https://vk.com/public209250049 https://vk.com/public209298805 https://vk.com/public209298789 https://vk.com/public209250046 https://vk.com/public209249995 https://vk.com/public209249993 https://vk.com/public209249990 https://vk.com/public209211432 https://vk.com/public209249983 https://vk.com/public209249955 https://vk.com/public209249951 https://vk.com/public209249946 https://vk.com/public209249859 https://vk.com/public209249942 https://vk.com/public209249892 https://vk.com/id691331608 https://vk.com/public209578989 https://vk.com/public209578950 https://vk.com/public209578938 https://vk.com/public209578933 https://vk.com/public209578925 https://vk.com/public209578914 https://vk.com/public209578899 https://vk.com/public209578888 https://vk.com/public209578880 https://vk.com/public209578893 https://vk.com/public209578873 https://vk.com/public209578867 https://vk.com/public209578862 https://vk.com/public209512875 https://vk.com/public209512865 https://vk.com/public209512856 https://vk.com/public209512847 https://vk.com/public209512843 https://vk.com/public209512838 https://vk.com/public209512826 https://vk.com/public209512816 https://vk.com/public209512811 https://vk.com/public209512801 https://vk.com/public209512791 https://vk.com/public209512748 https://vk.com/public209512718 https://vk.com/public209468471 https://vk.com/public209468465 https://vk.com/public209468449 https://vk.com/public209468440 https://vk.com/public209468455 https://vk.com/public209468436 https://vk.com/public209468430 https://vk.com/public209468423 https://vk.com/public209468420 https://vk.com/public209468418 https://vk.com/public209468400 https://vk.com/public209468391 https://vk.com/public209468380 https://vk.com/public209428748 https://vk.com/public209428746 https://vk.com/public209428735 https://vk.com/public209428738 https://vk.com/public209428732 https://vk.com/public209428729 https://vk.com/public209428726 https://vk.com/public209428723 https://vk.com/public209428721 https://vk.com/public209428705 https://vk.com/public209428700 https://vk.com/public209428710 https://vk.com/public209372099 https://vk.com/public209372093 https://vk.com/public209372086 https://vk.com/public209372073 https://vk.com/public209372066 https://vk.com/public209372059 https://vk.com/public209372050 https://vk.com/public209372042 https://vk.com/public209372033 https://vk.com/public209372028 https://vk.com/public209372018 https://vk.com/public209372011 https://vk.com/public209300371 https://vk.com/public209300362 https://vk.com/public209300352 https://vk.com/public209300343 https://vk.com/public209300333 https://vk.com/public209300325 https://vk.com/public209300315 https://vk.com/public209300304 https://vk.com/public209300300 https://vk.com/public209300297 https://vk.com/public209300275 https://vk.com/public209300271 https://vk.com/public209300252 https://vk.com/id691333652 https://vk.com/public209579274 https://vk.com/public209579265 https://vk.com/public209579260 https://vk.com/public209579251 https://vk.com/public209579240 https://vk.com/public209579232 https://vk.com/public209579224 https://vk.com/public209579217 https://vk.com/public209579208 https://vk.com/public209579199 https://vk.com/public209579187 https://vk.com/public209579176 https://vk.com/public209579168 https://vk.com/public209513027 https://vk.com/public209513018 https://vk.com/public209513011 https://vk.com/public209513004 https://vk.com/public209512995 https://vk.com/public209512986 https://vk.com/public209512977 https://vk.com/public209512971 https://vk.com/public209512966 https://vk.com/public209512957 https://vk.com/public209512953 https://vk.com/public209512946 https://vk.com/public209512938 https://vk.com/public209468590 https://vk.com/public209468563 https://vk.com/public209468557 https://vk.com/public209468551 https://vk.com/public209468544 https://vk.com/public209468537 https://vk.com/public209468527 https://vk.com/public209468523 https://vk.com/public209468515 https://vk.com/public209468505 https://vk.com/public209468499 https://vk.com/public209468493 https://vk.com/public209428794 https://vk.com/public209428790 https://vk.com/public209428788 https://vk.com/public209428785 https://vk.com/public209428780 https://vk.com/public209428777 https://vk.com/public209428774 https://vk.com/public209428771 https://vk.com/public209428768 https://vk.com/public209428766 https://vk.com/public209428761 https://vk.com/public209428759 https://vk.com/public209428755 https://vk.com/public209372256 https://vk.com/public209372248 https://vk.com/public209372245 https://vk.com/public209372227 https://vk.com/public209372216 https://vk.com/public209372238 https://vk.com/public209372200 https://vk.com/public209372196 https://vk.com/public209372175 https://vk.com/public209372184 https://vk.com/public209372161 https://vk.com/public209372138 https://vk.com/public209300713 https://vk.com/public209300701 https://vk.com/public209372149 https://vk.com/public209300682 https://vk.com/public209300675 https://vk.com/public209300660 https://vk.com/public209300654 https://vk.com/public209300616 https://vk.com/public209300624 https://vk.com/public209300610 https://vk.com/public209300604 https://vk.com/public209300592 https://vk.com/public209300584 https://vk.com/public209300527 https://vk.com/id691338584 https://vk.com/public209579598 https://vk.com/public209579588 https://vk.com/public209579579 https://vk.com/public209579574 https://vk.com/public209579568 https://vk.com/public209579560 https://vk.com/public209579549 https://vk.com/public209579535 https://vk.com/public209579527 https://vk.com/public209579522 https://vk.com/public209579514 https://vk.com/public209579508 https://vk.com/public209579500 https://vk.com/public209513195 https://vk.com/public209513186 https://vk.com/public209513173 https://vk.com/public209513165 https://vk.com/public209513151 https://vk.com/public209513142 https://vk.com/public209513118 https://vk.com/public209513114 https://vk.com/public209513109 https://vk.com/public209513099 https://vk.com/public209513083 https://vk.com/public209513078 https://vk.com/public209513063 https://vk.com/public209468710 https://vk.com/public209468704 https://vk.com/public209468692 https://vk.com/public209468685 https://vk.com/public209468681 https://vk.com/public209468673 https://vk.com/public209468664 https://vk.com/public209468659 https://vk.com/public209468649 https://vk.com/public209468644 https://vk.com/public209468636 https://vk.com/public209468629 https://vk.com/public209468622 https://vk.com/public209428854 https://vk.com/public209428850 https://vk.com/public209428846 https://vk.com/public209428840 https://vk.com/public209428836 https://vk.com/public209428832 https://vk.com/public209428828 https://vk.com/public209428825 https://vk.com/public209428823 https://vk.com/public209428818 https://vk.com/public209428809 https://vk.com/public209428808 https://vk.com/public209428804 https://vk.com/public209372563 https://vk.com/public209372541 https://vk.com/public209372512 https://vk.com/public209372485 https://vk.com/public209372457 https://vk.com/public209372402 https://vk.com/public209372429 https://vk.com/public209372379 https://vk.com/public209372370 https://vk.com/public209372352 https://vk.com/public209372345 https://vk.com/public209372364 https://vk.com/public209372337 https://vk.com/public209302220 https://vk.com/public209302215 https://vk.com/public209302204 https://vk.com/public209302191 https://vk.com/public209302182 https://vk.com/public209302173 https://vk.com/public209302166 https://vk.com/public209302150 https://vk.com/public209302146 https://vk.com/public209302138 https://vk.com/public209302131 https://vk.com/public209302036 https://vk.com/public209301900 https://vk.com/public209301786 https://vk.com/id691343832 https://vk.com/public209579817 https://vk.com/public209579811 https://vk.com/public209579800 https://vk.com/public209579793 https://vk.com/public209579774 https://vk.com/public209579784 https://vk.com/public209579758 https://vk.com/public209579762 https://vk.com/public209579752 https://vk.com/public209579741 https://vk.com/public209579732 https://vk.com/public209579725 https://vk.com/public209513346 https://vk.com/public209513337 https://vk.com/public209579724 https://vk.com/public209513322 https://vk.com/public209513316 https://vk.com/public209513305 https://vk.com/public209513297 https://vk.com/public209513281 https://vk.com/public209513270 https://vk.com/public209513264 https://vk.com/public209513258 https://vk.com/public209513244 https://vk.com/public209513238 https://vk.com/public209513227 https://vk.com/public209468855 https://vk.com/public209468797 https://vk.com/public209468790 https://vk.com/public209468806 https://vk.com/public209468775 https://vk.com/public209468784 https://vk.com/public209468763 https://vk.com/public209468753 https://vk.com/public209468746 https://vk.com/public209468741 https://vk.com/public209468734 https://vk.com/public209468732 https://vk.com/public209468726 https://vk.com/public209428902 https://vk.com/public209428898 https://vk.com/public209428896 https://vk.com/public209428891 https://vk.com/public209428887 https://vk.com/public209428892 https://vk.com/public209428879 https://vk.com/public209428881 https://vk.com/public209428876 https://vk.com/public209428863 https://vk.com/public209428861 https://vk.com/public209428858 https://vk.com/public209428856 https://vk.com/public209372843 https://vk.com/public209372837 https://vk.com/public209372833 https://vk.com/public209372826 https://vk.com/public209372822 https://vk.com/public209372811 https://vk.com/public209372767 https://vk.com/public209372715 https://vk.com/public209372777 https://vk.com/public209372739 https://vk.com/public209372696 https://vk.com/public209372679 https://vk.com/public209302709 https://vk.com/public209302701 https://vk.com/public209302695 https://vk.com/public209302683 https://vk.com/public209302648 https://vk.com/public209302675 https://vk.com/public209302662 https://vk.com/public209302640 https://vk.com/public209302634 https://vk.com/public209302628 https://vk.com/public209302606 https://vk.com/public209302599 https://vk.com/public209302591 https://vk.com/id691579795 https://vk.com/public209580125 https://vk.com/public209580120 https://vk.com/public209580107 https://vk.com/public209580094 https://vk.com/public209580091 https://vk.com/public209580079 https://vk.com/public209580074 https://vk.com/public209580068 https://vk.com/public209580055 https://vk.com/public209580045 https://vk.com/public209580059 https://vk.com/public209580034 https://vk.com/public209580027 https://vk.com/public209513550 https://vk.com/public209513547 https://vk.com/public209513535 https://vk.com/public209513526 https://vk.com/public209513522 https://vk.com/public209513514 https://vk.com/public209513504 https://vk.com/public209513495 https://vk.com/public209513486 https://vk.com/public209513476 https://vk.com/public209513440 https://vk.com/public209513413 https://vk.com/public209468973 https://vk.com/public209513403 https://vk.com/public209468965 https://vk.com/public209468943 https://vk.com/public209468937 https://vk.com/public209468922 https://vk.com/public209468915 https://vk.com/public209468909 https://vk.com/public209468905 https://vk.com/public209468900 https://vk.com/public209468895 https://vk.com/public209468885 https://vk.com/public209468879 https://vk.com/public209468874 https://vk.com/public209428950 https://vk.com/public209428945 https://vk.com/public209428939 https://vk.com/public209428936 https://vk.com/public209428934 https://vk.com/public209428942 https://vk.com/public209428913 https://vk.com/public209428926 https://vk.com/public209428922 https://vk.com/public209428920 https://vk.com/public209428917 https://vk.com/public209428909 https://vk.com/public209428908 https://vk.com/public209373045 https://vk.com/public209373037 https://vk.com/public209373029 https://vk.com/public209373015 https://vk.com/public209373004 https://vk.com/public209372991 https://vk.com/public209372979 https://vk.com/public209372955 https://vk.com/public209372947 https://vk.com/public209372929 https://vk.com/public209372901 https://vk.com/public209372880 https://vk.com/public209372893

关于 TCP 三次握手和四次挥手,满分回答在此

0. 前言

在面试中,计算机网络的 TCP 三次握手和四次挥手是很常见的问题,但是在实际面试中,面试官会更愿意听到怎样的回答呢?详细程度是怎样的?

越简单常见的问题越不可小觑,万丈高楼平地起,把简单的问题深入化,才更能拉开与竞争者的距离。掌握了本文讲的全部知识点,关于 TCP 三次握手和四次挥手基本就 OK 了 😊

1. TCP 和 UDP

讲解 TCP 三次握手和四次握手之前,我们先了解一下 TCP 和 UDP 这两个重量级的传输层协议。

💦 用户数据报协议 UDP(User Datagram Protocol):

  • UDP 在传送数据之前不需要先建立连接,远程主机在收到 UDP 报文后,不需要给出任何确认。
  • 虽然 UDP 不提供可靠交付,但在某些情况下 UDP 确是一种最有效的工作方式(一般用于即时通信),比如: QQ 语音、 QQ 视频 、直播等等

💦 传输控制协议 TCP(Transmission Control Protocol):

  • TCP 提供面向连接的服务。在传送数据之前必须先建立连接,数据传送结束后要释放连接。
  • TCP 不提供广播或多播服务。由于 TCP 要提供可靠的,面向连接的传输服务(TCP的可靠体现在TCP在传递数据之前,会有三次握手来建立连接,而且在数据传递时,有确认、窗口、重传、流量控制、拥塞控制机制,在数据传完后,还会四次挥手断开连接用来节约系统资源),这不仅使协议数据单元的首部增大很多,还要占用许多处理机资源。
  • TCP 一般用于文件传输、发送和接收邮件、远程登录等场景。

2. TCP 报文段首部格式

TCP 报文段的具体格式大家可以不必都记住,但是其中的几个控制位与我们接下来要讲的三次握手和四次挥手息息相关,大家一定要牢记。

首部固定部分各字段意义如下:

  • 1 - 源端口和目的端口:各占 2 个字节,分别写入源端口和目的端口。IP 地址 + 端口号就可以确定一个进程地址
  • 2 - 序号/序列号(Sequense Number,SN):在一个 TCP 连接中传送的字节流中的每一个字节都按顺序编号。该字段表示本报文段所发送的数据的第一个字节的序号。初始序号称为 Init Sequense Number, ISN(序号/序列号这个字段很重要,大家留个印象,下文会详细讲解)

    例如,一报文段的序号是 101,共有 100 字节的数据。这就表明:本报文段的数据的第一个字节的序号是 101,最后一个字节的序号是 200。显然,下一个报文段的数据序号应当从 201 开始,即下一个报文段的序号字段值应为 201。

  • 3 - 确认号 ack:期望收到对方下一个报文段的第一个数据字节的序号。若确认号为 N,则表明:到序号 N-1 为止的所有数据都已正确收到。
  • 4 - 数据偏移(首部长度):它指出 TCP 报文段的数据起始处距离 TCP 报文段的起始处有多远。这个字段实际上是指出TCP报文段的首部长度。
  • 5 - 保留:占 6 位,应置为 0,保留为今后使用。

⭐ 大家看上图,保留位的右边还有 6 个控制位(重要),这是TCP 用来说明该报文段性质的:

  • 紧急位 URG:当 URG = 1 时,表明此报文段中有紧急数据,是高优先级的数据,应尽快发送,不用在缓存中排队。该控制位需配合紧急指针使用(紧急指针指出本报文段中紧急数据的字节数)

    举个例子:我们需要取消一个已经发送了很长程序的运行,因此用户从键盘发出中断命令。如果不使用紧急数据,那么这个指令将存储在接收 TCP 的缓存末尾,只有在所有的数据被处理完毕后这两个字符才被交付接收方的应用进程,这样做就无法实现立即中断。

  • 确认 ACK:仅当 ACK = 1 时确认号字段才有效,当 ACK = 0 时确认号无效。TCP 规定,在连接建立后所有传送的报文段都必须把 ACK 置为 1。
  • 推送 PSH:当两个应用进程进行交互式的通信时,有时在一端的应用进程希望在键入一个命令后立即就能收到对方的响应。在这种情况下,TCP 就可以使用推送(push)操作。这时,发送方 TCP 把 PSH 置为 1,并立即创建一个报文段发送出去。接收方 TCP 收到 PSH = 1 的报文段,就尽快地交付接收应用进程。而不用等到整个缓存都填满了后再向上交付。
  • 复位 RST:当 RST = 1 时,表明 TCP 连接中出现了严重错误(如由于主机崩溃或其他原因),必须释放连接,然后再重新建立传输连接。
  • 同步 SYN:SYN = 1 表示这是一个连接请求或连接接受报文。

    当 SYN = 1 而 ACK = 0 时,表明这是一个连接请求报文段。对方若同意建立连接,则应在响应的报文段中使 SYN = 1 且 ACK = 1。

  • 终止 FIN:用来释放一个连接。当 FIN = 1时,表明此报文段的发送发的数据已发送完毕,并要求释放运输连接。

3. TCP 三次握手建立连接

① 三次握手过程详解

三次握手的原文是 three-way handshake,整个名词的可以翻译为:需要三个步骤才能建立握手/连接的机制。当然,三次握手也可以叫 three-message handshake,通过三条消息来建立的握手/连接。

进行三次握手的主要作用就是为了确认双方的接收能力和发送能力是否正常、指定自己的 初始化序列号(Init Sequense Number, ISN) 为后面的可靠性传输做准备。

三次握手过程如下图:

回顾一下图中字符的含义:

  • SYN:连接请求/接收 报文段
  • seq:发送的第一个字节的序号
  • ACK:确认报文段
  • ack:确认号。希望收到的下一个数据的第一个字节的序号

刚开始客户端处于 Closed 的状态,而服务端处于 Listen 状态:

CLOSED :没有任何连接状态

LISTEN :侦听来自远方 TCP 端口的连接请求

1)第一次握手:客户端向服务端发送一个 SYN 报文(SYN = 1),并指明客户端的初始化序列号 ISN(x),即图中的 seq = x,表示本报文段所发送的数据的第一个字节的序号。此时客户端处于 SYN_Send 状态。

SYN-SENT :在发送连接请求后等待匹配的连接请求

2)第二次握手:服务器收到客户端的 SYN 报文之后,会发送 SYN 报文作为应答(SYN = 1),并且指定自己的初始化序列号 ISN(y),即图中的 seq = y。同时会把客户端的 ISN + 1 作为确认号 ack 的值,表示已经收到了客户端发来的的 SYN 报文,希望收到的下一个数据的第一个字节的序号是 x + 1,此时服务器处于 SYN_REVD 的状态。

SYN-RECEIVED:在收到和发送一个连接请求后等待对连接请求的确认

3)第三次握手:客户端收到服务器端响应的 SYN 报文之后,会发送一个 ACK 报文,也是一样把服务器的 ISN + 1 作为 ack 的值,表示已经收到了服务端发来的的 SYN 报文,希望收到的下一个数据的第一个字节的序号是 y + 1,并指明此时客户端的序列号 seq = x + 1(初始为 seq = x,所以第二个报文段要 +1),此时客户端处于 Establised 状态。

服务器收到 ACK 报文之后,也处于 Establised 状态,至此,双方建立起了 TCP 连接。

ESTABLISHED:代表一个打开的连接,数据可以传送给用户

② 为什么要三次握手

三次握手的目的是建立可靠的通信信道,说到通讯,简单来说就是数据的发送与接收,而三次握手最主要的目的就是双方确认自己与对方的发送与接收是正常的。

只有经过三次握手才能确认双发的收发功能都正常,缺一不可:

  • 第一次握手(客户端发送 SYN 报文给服务器,服务器接收该报文):客户端什么都不能确认;服务器确认了对方发送正常,自己接收正常
  • 第二次握手(服务器响应 SYN 报文给客户端,客户端接收该报文):

    客户端确认了:自己发送、接收正常,对方发送、接收正常;

    服务器确认了:对方发送正常,自己接收正常

  • 第三次握手(客户端发送 ACK 报文给服务器):

    客户端确认了:自己发送、接收正常,对方发送、接收正常;

    服务器确认了:自己发送、接收正常,对方发送、接收正常

③ ISN (Initial Sequence Number) 是固定的吗

三次握手的其中一个重要功能是客户端和服务端交换 ISN(Initial Sequence Number),以便让对方知道接下来接收数据的时候如何按序列号组装数据。

当一端为建立连接而发送它的 SYN 时,它会为连接选择一个初始序号。ISN 随时间而变化,因此每个连接都将具有不同的 ISN。如果 ISN 是固定的,攻击者很容易猜出后续的确认号,因此 ISN 是动态生成的。

④ 三次握手过程中可以携带数据吗

第三次握手的时候,是可以携带数据的。但是,第一次、第二次握手绝对不可以携带数据

假如第一次握手可以携带数据的话,如果有人要恶意攻击服务器,那他每次都在第一次握手中的 SYN 报文中放入大量的数据,然后疯狂重复发 SYN 报文的话(因为攻击者根本就不用管服务器的接收、发送能力是否正常,它就是要攻击你),这会让服务器花费很多时间、内存空间来接收这些报文。

⭐ 简单的记忆就是,请求连接/接收 即 SYN = 1 的时候不能携带数据

而对于第三次的话,此时客户端已经处于 ESTABLISHED 状态。对于客户端来说,他已经建立起连接了,并且也已经知道服务器的接收、发送能力是正常的了,所以当然能正常发送/携带数据了。

⑤ 半连接队列

服务器第一次收到客户端的 SYN 之后,就会处于 SYN_RCVD 状态,此时双方还没有完全建立其连接,服务器会把这种状态下的请求连接放在一个队列里,我们把这种队列称之为半连接队列。

当然还有一个全连接队列,完成三次握手后建立起的连接就会放在全连接队列中。如果队列满了就有可能会出现丢包现象。

⑥ SYN 洪泛攻击

SYN 攻击就是 Client 在短时间内伪造大量不存在的 IP 地址,并向 Server 不断地发送 SYN 包,Server 则回复确认包,并等待 Client 确认,由于源地址不存在,因此 Server 需要不断重发直至超时,这些伪造的 SYN 包将长时间占用半连接队列,导致正常的 SYN 请求因为队列满而被丢弃,从而引起网络拥塞甚至系统瘫痪。

⑦ 如果第三次握手丢失了,客户端服务端会如何处理

服务器发送完 SYN-ACK 包,如果未收到客户端响应的确认包,也即第三次握手丢失。那么服务器就会进行首次重传,若等待一段时间仍未收到客户确认包,就进行第二次重传。如果重传次数超过系统规定的最大重传次数,则系统将该连接信息从半连接队列中删除。

注意,每次重传等待的时间不一定相同,一般会是指数增长,例如间隔时间为 1s,2s,4s,8s…

4. TCP 四次挥手释放连接

① 四次挥手过程详解

建立一个 TCP 连接需要三次握手,而终止一个 TCP 连接要经过四次挥手(也有将四次挥手叫做四次握手的)。这是由于 TCP 的半关闭(half-close)特性造成的,TCP 提供了连接的一端在结束它的发送后还能接收来自另一端数据的能力。

TCP 连接的释放需要发送四个包(执行四个步骤),因此称为四次挥手(Four-way handshake),客户端或服务端均可主动发起挥手动作。

回顾一下上图中符号的意思:

  • FIN :连接终止位
  • seq:发送的第一个字节的序号
  • ACK:确认报文段
  • ack:确认号。希望收到的下一个数据的第一个字节的序号

刚开始双方都处于ESTABLISHED 状态,假设是客户端先发起关闭请求。四次挥手的过程如下:

1)第一次挥手:客户端发送一个 FIN 报文(请求连接终止:FIN = 1),报文中会指定一个序列号 seq = u。并停止再发送数据,主动关闭 TCP 连接。此时客户端处于 FIN_WAIT1 状态,等待服务端的确认。

FIN-WAIT-1 - 等待远程TCP的连接中断请求,或先前的连接中断请求的确认;

2)第二次挥手:服务端收到 FIN 之后,会发送 ACK 报文,且把客户端的序号值 +1 作为 ACK 报文的序列号值,表明已经收到客户端的报文了,此时服务端处于 CLOSE_WAIT 状态。

CLOSE-WAIT - 等待从本地用户发来的连接中断请求;

此时的 TCP 处于半关闭状态,客户端到服务端的连接释放。客户端收到服务端的确认后,进入FIN_WAIT2(终止等待 2)状态,等待服务端发出的连接释放报文段。

FIN-WAIT-2 - 从远程TCP等待连接中断请求;

3)第三次挥手:如果服务端也想断开连接了(没有要向客户端发出的数据),和客户端的第一次挥手一样,发送 FIN 报文,且指定一个序列号。此时服务端处于 LAST_ACK 的状态,等待客户端的确认。

LAST-ACK - 等待原来发向远程TCP的连接中断请求的确认;

4)第四次挥手:客户端收到 FIN 之后,一样发送一个 ACK 报文作为应答(ack = w+1),且把服务端的序列值 +1 作为自己 ACK 报文的序号值(seq=u+1),此时客户端处于 TIME_WAIT (时间等待)状态。

TIME-WAIT - 等待足够的时间以确保远程TCP接收到连接中断请求的确认;

🚨 注意 !!!这个时候由服务端到客户端的 TCP 连接并未释放掉,需要经过时间等待计时器设置的时间 2MSL(一个报文的来回时间) 后才会进入 CLOSED 状态(这样做的目的是确保服务端收到自己的 ACK 报文。如果服务端在规定时间内没有收到客户端发来的 ACK 报文的话,服务端会重新发送 FIN 报文给客户端,客户端再次收到 FIN 报文之后,就知道之前的 ACK 报文丢失了,然后再次发送 ACK 报文给服务端)。服务端收到 ACK 报文之后,就关闭连接了,处于 CLOSED 状态。

② 为什么要四次挥手

由于 TCP 的半关闭(half-close)特性,TCP 提供了连接的一端在结束它的发送后还能接收来自另一端数据的能力。

任何一方都可以在数据传送结束后发出连接释放的通知,待对方确认后进入半关闭状态。当另一方也没有数据再发送的时候,则发出连接释放通知,对方确认后就完全关闭了TCP连接。

通俗的来说,两次握手就可以释放一端到另一端的 TCP 连接,完全释放连接一共需要四次握手。

举个例子:A 和 B 打电话,通话即将结束后,A 说 “我没啥要说的了”,B 回答 “我知道了”,于是 A 向 B 的连接释放了。但是 B 可能还会有要说的话,于是 B 可能又巴拉巴拉说了一通,最后 B 说“我说完了”,A 回答“知道了”,于是 B 向 A 的连接释放了,这样整个通话就结束了。

posted @ 2021-01-07 22:56  前所未有  阅读(115)  评论(0)    收藏  举报
http://energyfuture.wikidot.com/