彻彻底底地理解TCP三次握手和四次挥手的全部过程
三次握手
我们先提出一些问题,但是我们暂且不回答这些问题,下面我会尽我所能详尽地讲解TCP的三次握手过程,然后看完你可以在评论区留下你对问题的答案,我们可以一起探讨。
- 为什么要握手
- 为什么是三次而不是两次或者四次
- 相比不需要握手的UDP有什么优点和缺点
- 握手的过程可以携带数据吗
- 握手的过程会带来什么安全问题吗
TCP被称为是面向连接的,这是因为一个应用进程可以开始向另一个应用进程发送数据之前,这两个进程必须先互相“握手”,以建立确保数据传输的参数。
下面放一张图

首先cilent向server发送SYN(用于建立连接的字段)报文,这里seq取一个随机数(不知道seq作用的可以另外单独理解,不妨碍理三次握手),这个报文是不携带数据的,然后发送完之后,cilent就变成SYN_SENT状态(等待接受ack报文)并且可能建立发送缓冲区,然后server接受到cilent的请求连接报文之后(第一次握手),发送SYN-ACK报文,同样不携带数据,在这一时间也可能建立接受缓冲区,注意到这里,因为这个特质,导致服务器可能被洪范攻击
(假如攻击者发送大量TCP SYN报文(第一次握手),然后又不进行第三次握手,服务器就要为这些大量的第一次握手分配资源(比如缓存),导致服务器的连接资源被消耗殆尽(当然魔高一尺,道高一丈,有一种防御系统SYNcookie可以应对))
最后客户端接受到SYN-ACK报文后发送第三次握手,注意这一次握手是可以携带数据的
整个过程就像你游戏开语音,你进去csgo的时候,会主动开麦(客户端),喂喂听得到吗,然后队友说能听到,你能听到我的吗(第二次握手),最后你说,我也能听到你说话,接下来我们怎么怎么打(第三次握手),假如两次握手的话,我是知道队友能听见我说话了我也能听见队友说话了,但是你管队友了吗。四次的话,废话少说吧就
TCP的握手确保了双方都能全双工地进行通信,使得通信是有保障的,当然这样也会浪费一些时间,但是是值得的,大部分重要的事情还是求稳比较好,这也是TCP存在的意义,可靠且值得交付。
好了讲完之后我再给大家留个问题,那个seq有什么作用大家能回答吗(提醒,假如我说喂,你听得到吗,假如对面恰巧没带耳机,没听到怎么办,又或者团队游戏,他不知道是哪个人在发言怎么办)
四次挥手
- 为什么是四次挥手
- 为什么要TIME_WAIT或者CLOSE_WAIT
- TIME_WAIT的时间设置为多长比较好
老规矩先上图

这是一个较为简单的报文交换图,中间省去了很多状态(都是逻辑状态,省略了就省略了吧)。因为是全双工通信,所以当客户端首先发送FIN报文时,就是想告诉服务器,它要关闭连接了,接收到ACK进入一个FIN_WAIT2的状态,这个时候客户端就已经不在发送数据了。那么问题来了,还要保持连接干嘛?为什么不直接关闭连接
那是因为客户端的数据是发送完了,服务端数据还不一定发送完了呢。你问人家一个问题,你是问完了,人家还不一定回答完了你就打断人家不太好吧。所以当服务端发送完数据后就发送FIN报文给客户端,这个时候客户端再发送ACK告诉服务端说收到。
但是注意!!这个时候连接还没有关闭噢,你想想,假如这个ack报文丢失了怎么办,前面的报文丢失,都可以超时重传,但是这里客户端你就直接关闭连接,假如ack丢失,服务端一直在等你的答复你却已经走了,是不是也不太好。所以即使发送完最后的ack应答报文,会有一个TIME_WAIT的时间,这样当ack丢失时,服务端超时未收到会再发一次FIN,客户端就知道丢失了重传
那么这个wait的时间是多久呢,因为当超过一个MSL时,重发FIN,重发FIN最多需要一个MSL,客户端知道丢失的时间最长为2MSL,所以wait的时间为2MSL
彻彻底底地理解TCP三次握手和四次挥手的全部过程的更多相关文章
- 理解TCP三次握手和四次挥手
TCP相关知识 TCP是面向连接的传输层协议,它提供可靠交付的.全双工的.面向字节流的点对点服务.HTTP协议便是基于TCP协议实现的.(虽然作为应用层协议,HTTP协议并没有明确要求必须使用TCP协 ...
- TCP三次握手及四次挥手详细图解
TCP三次握手及四次挥手详细图解 Andrew Huangbluedrum@163.com 相对于SOCKET开发者,TCP创建过程和链接折除过程是由TCP/IP协议栈自动创建的.因此开发者并不 ...
- 脑残式网络编程入门(一):跟着动画来学TCP三次握手和四次挥手
.引言 网络编程中TCP协议的三次握手和四次挥手的问题,在面试中是最为常见的知识点之一.很多读者都知道“三次”和“四次”,但是如果问深入一点,他们往往都无法作出准确回答. 本篇文章尝试使用动画图片的方 ...
- TCP‘三次握手’和‘四次挥手’(通俗易懂)
概述 我们都知道 TCP 是 可靠的数据传输协议,UDP是不可靠传输,那么TCP它是怎么保证可靠传输的呢?那我们就不得不提 TCP 的三次握手和四次挥手. 三次握手 下图为三次握手的流程图 下面通 ...
- [转帖]脑残式网络编程入门(一):跟着动画来学TCP三次握手和四次挥手
脑残式网络编程入门(一):跟着动画来学TCP三次握手和四次挥手 http://www.52im.net/thread-1729-1-1.html 1.引言 网络编程中TCP协议的三次握手和 ...
- 学习 TCP 三次握手和四次挥手
TCP三次握手和四次挥手的问题在面试中是最为常见的考点之一.很多读者都知道三次和四次,但是如果问深入一点,他们往往都无法作出准确回答. 本篇尝试使用动画来对这个知识点进行讲解,期望读者们可以更加简单地 ...
- TCP三次握手和四次挥手、HTTP协议
TCP三次握手和四次挥手 首先我们知道HTTP协议通常承载于TCP协议之上,HTTPS承载于TLS或SSL协议层之上 通过上面这张图我们能够知道. 在Http工作之前,Web浏览器通过网络和W ...
- 浅谈浏览器解析 URL+DNS 域名解析+TCP 三次握手与四次挥手+浏览器渲染页面
(1)浏览器解析 URL 为了能让我们的知识层面看起来更有深度,我们应该考虑下面两个问题了: 从浏览器输入 URL 到渲染成功的过程中,究竟发生了什么? 浏览器渲染过程中,发生了什么,是不是也有重绘与 ...
- TCP 三次握手和四次挥手
TCP 三次握手和四次挥手 作为面试会被经常考察的的点,自己复习了一下,总结如下: TCP 三次握手 先上图: 所谓三次握手,是指建立一个 TCP 连接时,需要客户端和服务器总共发送 3 个包. 第一 ...
随机推荐
- KubeCon 2021|使用 eBPF 代替 iptables 优化服务网格数据面性能
作者 刘旭,腾讯云高级工程师,专注容器云原生领域,有多年大规模 Kubernetes 集群管理及微服务治理经验,现负责腾讯云服务网格 TCM 数据面产品架构设计和研发工作. 引言 目前以 Istio[ ...
- linux下编译php扩展
1 在pecl.php.net搜索你需要的php扩展 2 在解压后的扩展目录运行phpize 3 执行编译./configure --with-php-config=/usr/local/php/bi ...
- 使用 WPF 做个 PowerPoint 系列 基于 OpenXML 解析实现 PPT 文本描边效果
本文是使用 WPF 做个 PowerPoint 系列的博客,本文来告诉大家如何解析 PPT 里面的文本描边效果,在 WPF 应用中绘制出来,实现像素级相同 背景知识 在开始之前,期望你了解了 PPT ...
- HUST-计算机网络实验-socket编程
随笔---HUST计网实验:socket编程 博主大三在读,第一次写随笔,水平有限,就当记录一下学习的过程,顺便面试前复习项目的时候看看. 实验要求: 编写一个 Web 服务器软件,要求如下: 基本要 ...
- 禁用copy on write实现全局EAT HOOK
以前写过一个,但是一不小心删除了,哎,就当再次复习复习吧. 首先抛出一个有意思的问题: 已知所有Windows可执行文件exe都会链接子系统ntdll.dll,那么真实内存中有几份ntdll.dll? ...
- CF1025B Weakened Common Divisor 题解
Content 定义 \(n\) 个数对 \((a_1,b_1),(a_2,b_2),(a_3,b_3),...,(a_n,b_n)\) 的 \(\text{WCD}\) 为能够整除每个数对中至少一个 ...
- linux安装软件系列之yum安装
自动搜索最快镜像插件: yum install yum-fastestmirror 安装yum图形窗口插件: yum install yumex 1.安装 yum install 全部安装 yum i ...
- 如何获得Spring容器里管理的Bean,。不论是Service层,还是实体Dao层
如何获得Spring容器里管理的Bean,.不论是Service层,还是实体Dao层, 下面的这个必须配置,否则必出错,空指针 下面的这个是代码 而获得bean代码如下: serviceManager ...
- 用jQuery实现数字滚动效果
html 部分 <div class="js-box box"></div> css 部分 .statistic .box{ display: inline ...
- JAVA地址通过百度地图API转化为经纬度
public static Map getLngAndLat(String address) { Map map = new HashMap(); String url = "http:// ...