TCP的三次握手和四次挥手总结

本文经过借鉴书籍资料、他人博客总结出的知识点,欢迎提问

序列号 seq:占 4 个字节,用来标记数据段的顺序,TCP 把连接中发送的所有数据字节都编上一个序号,第一个字节的编号由本地随机产生;给字节编上序号后,就给每一个报文段指派一个序号;序列号 seq 就是这个报文段中的第一个字节的数据编号。确认号 ack:占 4 个字节,期待收到对方下一个报文段的第一个数据字节的序号;序列号表示报文段携带数据的第一个字节的编号;而确认号指的是期望接收到下一个字节的编号;因此当前报文段最后一个字节的编号 + 1 即为确认号。确认 ACK:占 1 位,仅当 ACK=1 时,确认号字段才有效。ACK=0 时,确认号无效同步 SYN:连接建立时用于同步序号。当 SYN=1,ACK=0 时表示:这是一个连接请求报文段。若同意连接,则在响应报文段中使得 SYN=1,ACK=1。因此,SYN=1 表示这是一个连接请求,或连接接受报文。SYN 这个标志位只有在 TCP 建产连接时才会被置 1,握手完成后 SYN 标志位被置 0。终止 FIN:用来释放一个连接。FIN=1 表示:此报文段的发送方的数据已经发送完毕,并要求释放运输连接PS:ACK、SYN 和 FIN 这些大写的单词表示标志位,其值要么是 1,要么是 0;ack、seq 小写的单词表示序号。

六大标志位

SYN,同步标志位;ACK确认标志位;PSH传送标志位;FIN结束标志位;RST重置标志位;URG紧急标志位;seq序号;ack确认号

具体

字段 含义
URG 紧急指针是否有效。为 1,表示某一位需要被优先处理
ACK 确认号是否有效,一般置为 1。
PSH 提示接收端应用程序立即从 TCP 缓冲区把数据读走。
RST 对方要求重新建立连接,复位。
SYN 请求建立连接,并在其序列号的字段进行序列号的初始值设定。建立连接,设置为 1
FIN     希望断开连接。

三次握手过程理解

第一次握手:建立连接时,客户端发送 syn 包(syn=x)到服务器,并进入 SYN_SENT 状态,等待服务器确认;SYN:同步序列编号(Synchronize Sequence Numbers)。

第二次握手:服务器收到 syn 包,必须确认客户的 SYN(ack=x+1),同时自己也发送一个 SYN 包(syn=y),即 SYN+ACK 包,此时服务器进入 SYN_RECV 状态;

第三次握手:客户端收到服务器的 SYN+ACK 包,向服务器发送确认包 ACK(ack=y+1),此包发送完毕,客户端和服务器进入 ESTABLISHED(TCP 连接成功)状态,完成三次握手。

四次挥手过程理解

  1. 第一次分手:主机1(可以使客户端,也可以是服务器端),设置Sequence Number和Acknowledgment Number,向主机2发送一个FIN报文段;此时,主机1进入FIN_WAIT_1状态;这表示主机1没有数据要发送给主机2了;

  2. 第二次分手:主机2收到了主机1发送的FIN报文段,向主机1回一个ACK报文段,Acknowledgment Number为Sequence Number加1;主机1进入FIN_WAIT_2状态;主机2告诉主机1,我“同意”你的关闭请求;

  3. 第三次分手:主机2向主机1发送FIN报文段,请求关闭连接,同时主机2进入LAST_ACK状态

  4. 第四次分手:主机1收到主机2发送的FIN报文段,向主机2发送ACK报文段,然后主机1进入TIME_WAIT状态;主机2收到主机1的ACK报文段以后,就关闭连接;此时,主机1等待2MSL后依然没有收到回复,则证明Server端已正常关闭,那好,主机1也可以关闭连接了。

常见面试题

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

答:因为当处于LISTEN状态的服务器端收到来自客户端的SYN报文(客户端希望新建一个TCP连接)时,它可以把ACK(确认应答)和SYN(同步序号)放在同一个报文里来发送给客户端。但在关闭TCP连接时,当收到对方的FIN报文时,对方仅仅表示对方已经没有数据发送给你了,但是你自己可能还有数据需要发送给对方,则等你发送完剩余的数据给对方之后,再发送FIN报文给对方来表示你数据已经发送完毕,并请求关闭连接,所以通常情况下,这里的ACK报文和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 个探测报文仍然没反应,服务器就认为客户端出了故障,接着就关闭连接。

文章图片来源:湖科大计算机网络课程PPT

文字部分:TCP的三次握手与四次挥手理解及面试题(很全面)_青柚_的博客-CSDN博客_四次握手

TCP的三次握手和四次挥手总结相关推荐

  1. 一文搞懂TCP的三次握手和四次挥手

    目录 1.三次握手 2.四次挥手 3.11种状态名词解析 TCP的三次握手和四次挥手实质就是TCP通信的连接和断开. 三次握手:为了对每次发送的数据量进行跟踪与协商,确保数据段的发送和接收同步,根据所 ...

  2. 为什么有TCP 的三次握手 和 四次挥手

    由于我们的设备上的通信程序很直接,所以当时没有仔细想过TCP的三次握手和四次挥手这个问题,有的时候自己写的时候 会忘掉这个问题,就是为什么会有三次握手的过程和4次挥手的过程 简单来说就一句话 &quo ...

  3. TCP的三次握手和四次挥手的过程?

    TCP的三次握手和四次挥手的过程? 如下2幅图 如下2幅图

  4. c++TCP的三次握手和四次挥手

    该博文为原创文章,未经博主同意不得转载,如同意转载请注明博文出处 本文章博客地址:https://cplusplus.blog.csdn.net/article/details/105043395 T ...

  5. 了解TCP的三次握手和四次挥手

    了解TCP的三次握手和四次挥手 一.    TCP/IP OSI参考模型 了解TCP的三次握手和四次挥手,我们首先从TCP/IP OSI参考模型说起. OSI(Open System Intercon ...

  6. TCP连接三次握手和四次挥手

    摘要: 本文主要介绍TCP连接三次握手和四次挥手的机制. 1.三次握手 (1)三次握手的详述 首先Client端发送连接请求报文,Server段接受连接后回复ACK报文,并为这次连接分配资源.Clie ...

  7. TCP的三次握手和四次挥手及常见面试题

    一.前言 今天上掘金查看热门文章,发现一篇好文 ★前端 100 问:能搞懂 80% 的请把简历给我 ★ ,此文包含100个前端面试问题,仔细阅读完所有题目后,顿感身中数刀无法呼吸,留下了没有技术的泪水 ...

  8. 【运维面试】面试官问到tcp/ip三次握手,四次挥手,这么回答就对了

    我之前面试过很多运维人员,每次都绕不开tcp/ip三次握手,四次挥手: 面试者的回答也是八仙过海各显神通 有讲故事的,有画图的,有把自己讲晕了的: 那这个该怎么回答呢? 我总结下来可以这么来说: 三次 ...

  9. TCP和UDP区别以及TCP的三次握手和四次挥手

    TCP和UDP的概念 TCP: 传输控制协议(TCP,Transmission Control Protocol)是一种面向连接的.可靠的.基于字节流的传输层通信协议 UDP: Internet 协议 ...

  10. 【重难点】【计算机网络 02】TCP 和 UDP 的区别、TCP 的三次握手和四次挥手、HTTP 和 HTTPS、HTTP 各版本之间的区别、HTTP 如何实现长连接

    [重难点][计算机网络 02]TCP 和 UDP 的区别.TCP 的三次握手和四次挥手.HTTP 和 HTTPS.HTTP 各版本之间的区别.HTTP 如何实现长连接 文章目录 [重难点][计算机网络 ...

最新文章

  1. Struts2利用iText导出word文档(包含表格)
  2. python语言支持哪些类型的运算符_Python运算符有哪些类型?Python学习
  3. 张勇谈组织架构调整:领导者要善于“从后排把人往前拔”
  4. 杭电acm2059-龟兔赛跑 java
  5. 前端学习(3204):复习类相关知识2
  6. (四)为深度伪造预处理数据集
  7. Eclipse怎样连接并打开oracle等数据库?
  8. 今天我离开了工作四年的大宇
  9. 更改我的网页默认的暴风影音播放器
  10. 局域网常见攻击方式原理
  11. 一分钟读懂dB、dBm、dBw的区别
  12. 0xc0000225无法进系统_手把手研习win10系统出现0xc0000225无法进入系统的方法
  13. HDU 6045 Is Derek lying? 水题
  14. c语言数码管显示小数点,8位数码管显示正整数和小数及解决鬼影问题
  15. Android星座运势案例
  16. css filter blur 白边,解决css3毛玻璃效果(blur)有白边问题
  17. 湖仓一体:基于Iceberg的湖仓一体架构在B站的实践
  18. 解决Java.lang.NoClassDefFoundError:com/lowagie/text/Elemen的问题
  19. 编译原理LR(1)语法分析器 C++实现
  20. 敏捷绩效管理三剑客:OKR 、KPI、CFR

热门文章

  1. USB UVC实战笔记第2篇—提取描述符信息
  2. iperf3测试带宽和丢包率
  3. python opencv 录制视频_如何使用OpenCV、Python和深度学习在图像和视频中实现面部识别?...
  4. java 椭圆_用Java绘制椭圆
  5. 【白话模电2】二极管特性和分类
  6. ArcGIS 10.1 for Server SOE介绍及开发
  7. 信息安全数学基础——整除的概念
  8. python安装flask模块_Python3.6 安装Flask 模块
  9. [DForm]我也来做自定义Winform之另类标题栏重绘
  10. 基于FPGA的spwm产生VHDL