TCP 为什么做三次握手、四次挥手?

TCP 是为了解决可靠传输出现的。为了实现可靠性,TCP 做了流量控制、拥塞控制,并且在建立、关闭连接前做些机制:三次握手、四次挥手。

三次握手是为了让客户端、服务器在建立连接前能保证相互可以发送、接收报文;

四次挥手也一样,客户端、服务器保证相互都得知要关闭时再关闭连接。

如果建立、关闭连接前没有做出这种保障,而直接发送报文或率先关闭,会出现报文丢失等风险。

(注意这里的保证不是指百分百的)

那为什么是三次握手?而不是两次、四次?

假如客户端 A、服务器 B,这里用打电话来做比喻:

  1. A 说:喂喂,听得到吗?

  2. (B 听了之后,知道了自己能听到 A 讲的话。)

    B 回复说:可以。你能听得到吗?

  3. (A 听了之后,他就能知道 B 可以听到自己的讲的话,并且自己也能听到 B。

    但此时 B 还不知道 A 能不能听得到他自己说的话,所以 A 还要回复。)

    A 回复:嗯,听得到。

    这时 A、B 便可以知道相互都能说、听,接下来可以开始聊了(即建立连接开始发送数据)。

如果是两次握手

从上面例子就能看出,如果只做两次握手,假如当 A 手机没电被关机时,B 就可能不知道情况而一直讲话。

所以,建立连接前,如果想可靠传输,必须要先保证相互能正常接收报文。

如果是四次握手

四次五次或者更多都可以,但这样其实会有点多余了。所以做三次握手即可。

为什么是四次挥手?而不是一次、两次、三次?

与上面例子一样,客户端 A、服务器 B 在打电话:

  1. A 说:我困了,想睡觉。

  2. B 回复:OK,等我还有些事要跟你讲。

  3. B 讲完后,说:我说完了,你去睡吧,拜拜。

  4. A 回复:嗯,晚安。

    这时 A、B 就可以挂电话了。

    说完,A 等 2 秒后挂了电话,同时 B 听到回复后也挂了,即关闭了连接。

如果是一次、两次挥手

从上面例子可以看出,因为 B 可能还有话要讲,所以 A 不能说完就挂掉。

如果是三次挥手

B 说拜拜后直接关闭,他就不确定 A 有没有听到他之前(2到3)讲的话。并且假如 A 恰好没有听到 B 说拜拜,A 就可能一直拿着电话。

所以 B 还要等 A 的回复。

第四次挥手后,客户端为什么还要等 2MSL 的时间后再关闭连接?

(这里 MSL 是:Maximum Segment Lifetime,即报文最大生存时间。是任何报文在网络中存在的最长时间。超过这个时间将被丢弃。)

同上,如果 A 直接关掉,假如 B 没有收到第四次挥手,他就不知道 A 有没有听到自己讲过的话。

所以 B 超过一段时间没收到的话,会再次跟 A 说拜拜。而 A 等待的 2MSL 的时间内,可以接收到该重发的消息,这样 A 就可以再次向 B 回复。(A、B 都有超时机制,如果还是一直收不到会断开连接。)

此外,A 直接关闭的另一个风险就是:如果 A 的原进程端口恰好又被其他新进程占用,那么新进程就会被接收到来自 B 的消息。

其他文章

上面写的例子只是为了简单理解,举的例子其实是不严谨的。比如,由于可能接收到的报文是已经过期的,双方需要用唯一序列号来做下验证等。

TCP没那么难吧?

TCP没那么难吧【续】

认个错,TCP的“三次握手、四次挥手”,不能想当然

关于TCP/IP系列文章的番外篇

TCP为什么做三次握手、四次挥手的更多相关文章

  1. python摸爬滚打之----tcp协议的三次握手四次挥手

    TCP协议的三次握手, 四次挥手 三次握手过程 1, 服务器时刻准备接受客户端进程的连接请求, 此时服务器就进入了LISTEN(监听)状态; 2, 客户端进程然后向服务器发出连接请求报文, 之后客户端 ...

  2. Python进阶----网络通信基础 ,OSI七层协议() ,UDP和TCP的区别 , TCP/IP协议(三次握手,四次挥手)

    Python进阶----网络通信基础 ,OSI七层协议() ,UDP和TCP的区别 , TCP/IP协议(三次握手,四次挥手) 一丶CS/BS 架构 C/S: 客户端/服务器    定义:       ...

  3. OSI七层协议&TCP协议(三次握手四次挥手)

    今日内容 python 基础回顾 软件开发架构 网络理论前戏 OSI 七层协议(五层) TCP协议 三次握手与四次挥手 UDP协议 内容详细 一.python 基础回顾 1.基本数据类型 整型 int ...

  4. TCP/IP报文 三次握手 四次挥手

    1.TCP报文格式  TCP/IP协议的详细信息参看<TCP/IP协议详解>三卷本.下面是TCP报文格式图:图1 TCP报文格式  上图中有几个字段需要重点介绍下:  (1)序号:Seq序 ...

  5. 关于TCP传输的三次握手四次挥手策略

    简单小总结: 一般为了能够准确无误地把数据送达目标处,TCP协议采用了三次握手策略.用TCP协议把数据包送出去后,TCP不会对传送后的情况置之不理,它一定会向对方确认是否成功送达. 注:握手过程中使用 ...

  6. TCP传输的三次握手四次挥手策略

    为了准确无误地数据送达目标处,TCP协议采用了三次握手策略.用TCP协议把数据包送出去后,TCP不会对传送后的情况置之不理,它一定会向对方确认是否成功送达.握手中使用了TCP的标志:SYN和ACK 发 ...

  7. tcp协议:三次握手四次挥手详解-转

    https://www.cnblogs.com/welan/p/9925119.html

  8. tcp/ip原理/三次握手/四次挥手

    @ tcp/ip原理 1.1 tcp/ip三次握手 1.1.1 建立过程说明 a)   由主机A发送建立TCP连接的请求报文, 其中报文中包含seq序列号, 是由发送端随机生成的, 并且还将报文中SY ...

  9. TCP/IP,三次握手四次挥手,TCP/UDP , HTTP/HTTPS

    internet:通用名词,由多个计算机网络组成的网络,网络间的通信协议是任意的 Internet:专用名词,当前全球最大的开放计算机网络,采用TCP/IP协议族作为通信的规则.www万维网是广泛应用 ...

  10. TCP连接为什么三次握手四次挥手

    前几天面试某电商被问住了,问的很细,我就说了说连接过程,必然凉凉.在csdn上找了一篇很详细的博客.https://blog.csdn.net/hyg0811/article/details/1023 ...

随机推荐

  1. 我们现在的git版本管理

    1.git发布正式版都统一用master分支的代码发布2.每次开发下一版本的需求时,将master分支的代码打一个tag,版本号与后台一致3.需要紧急修复线上的bug时,从master分支拉一个分支出 ...

  2. Python之爬虫(十四) Scrapy框架的架构和原理

    这一篇文章主要是为了对scrapy框架的工作流程以及各个组件功能的介绍 Scrapy目前已经可以很好的在python3上运行Scrapy使用了Twisted作为框架,Twisted有些特殊的地方是它是 ...

  3. Python面向对象04 /封装、多态、鸭子类型、类的约束、super

    Python面向对象04 /封装.多态.鸭子类型.类的约束.super 目录 Python面向对象04 /封装.多态.鸭子类型.类的约束.super 1. 封装 2. 多态 3. 鸭子类型 4. 类的 ...

  4. Java 分布式任务调度平台:PowerJob 快速开始+配置详解

    本文适合有 Java 基础知识的人群 作者:HelloGitHub-Salieri 引言 HelloGitHub 推出的<讲解开源项目>系列. 项目地址: https://github.c ...

  5. python---Flask使用教程-加载静态文件

    flask的静态文件,一般放在static目录下,前端页面放在templates下(而且这两个名字是定死的(static,templates)),目录结构如图: 模板(index.html)里加载静态 ...

  6. db2数据库字段更新当前时间

    db2数据库中想要将字段的时间通过sql语句的方式更新: 例如: Update tablename set 字段1='打酱油', 字段2 = TO_CHAR(current timestamp,'YY ...

  7. SqlServer同义词

    最近在项目中遇到跨库操作具有相同表结构的数据表的问题.(A库中的数据表a和B库中的数据表b,两者表结构相同) 跨库操作中我们一般是为了实现不同数据库中表字段信息,字段状态等实时同步,可能很多人会想到使 ...

  8. 【SpringBoot】 中时间类型 序列化、反序列化、格式处理

    [SpringBoot] 中时间类型 序列化.反序列化.格式处理 Date yml全局配置 spring: jackson: time-zone: GMT+8 date-format: yyyy-MM ...

  9. 【真实分享】学习linux!让我工资翻5倍!从月薪3000到年薪18W!只用了六个月!

    月薪3000到年薪18W,我用了六个月时间.从只会皮毛,到一家公司的运维工程师主力,我的故事蛮神奇的,今天和大家分享一下我自己的经历. 我今年26岁,之前做个体,修过电脑,卖过电脑,做过桌面运维,一直 ...

  10. 代码Verify简介

    序 对于开发者而言,编译代码和提交代码是必不可少的流程,同一个需求反复提交的情况也时常出现,那么怎么避免这种情况,且保证代码的质量,这就是Verify CI的目标.Verify表示认证验证的意思,结合 ...