TCP 三次握手/四次挥手

Tcp三次握手四次挥手和SSL/TLS 由于TCP连接是全双工的(即双方可以同时发送和接收数据),每一方都需要单独关闭各自的数据传输通道,确保连接的安全终止。它们提供了一种在客户端(如浏览器)和服务器之间建立安全通信的方式,确保数据传输的保密性、完整性和真实性。确保客户端和服务器都能够确认对方准备好建立连接,并且可以同步初始序列号,以保证数据传输的有序性和完整性。:在应用层和传输层之间执行,通常在TCP三次握手完成后进行,用于建立安全的加密通信。此时,客户端和服务器之间的连接已经建立,可以开始进行数据的传输。客户端在收到服务器的FIN后,进入。 阅读详情

TCP 三次握手/四次挥手

TCP 基本认识

什么是 TCP ?

TCP 是一种 面向连接、可靠、基于字节流的协议

什么是 TCP 连接?

Socket + Seq + WindowSize

  • Socket:IP + Port
  • Seq:序列号
  • WindowSize:窗口大小

如何唯一确定一个 TCP 连接

源 IP + 源 Port + 目的 IP + 目的 Port

TCP 连接数的上限?

理论上限:32 位 IP + 16 位 Port,即 2^46

实际远远达不到,取决于:

  • 最大文件描述符数量(三个等级:系统级、用户级、进程级)
  • 系统内存大小

TCP 与 UDP 区别?使用场景有什么不同?

  1. TCP 有连接,UDP 无连接
  2. TCP 可靠,UDP 不保证可靠(尽最大努力交付,可以在应用层实现可靠,如 QUIC)
  3. TCP 一对一,UDP 可以一对一、一对多、多对多
  4. TCP 有流量控制、拥塞窗口等,UDP 没有
  5. TCP 面向字节流,UDP 面向报文
  6. 分片机制:TCP 在传输层就可以分片,UDP 仅可能在 IP(网络层)分片
  7. 首部开销:TCP 的首部较大,UDP 较小

使用场景:

TCP 适用于需要保证绝对可靠的场景,如下载、HTTP 等

UDP 适用于允许一定丢包的场景,如视频通话、直播等

TCP、UDP 可以用同一个端口吗?

可以

在这里插入图片描述

图片来自小林 coding

TCP 连接建立

三次握手过程?

在这里插入图片描述

第三次握手可以携带应用层数据

为什么是三次?不是两次?四次?

常见的说法:三次握手可以保证通信双方都具有发送和接收的能力

更详细的说,分为三点:

避免历史连接

在这里插入图片描述

如果是两次握手,那么 Server 先收到历史的 SYN 报文,就会 立即分配资源,建立 TCP 连接(历史连接)

然后,Client 收到历史报文的 ACK 后,发现 ack 与预期不符,就会发送 RST 报文给 Server

Server 收到 RST 报文,终止建立的 TCP 连接

可以发现,对于 Server 来说,造成了资源浪费,不应该为历史连接分配资源

而采取三次握手,Server 在第二次握手不会立即分配资源,就避免了资源浪费

因此,三次握手最主要的原因就是 避免历史连接

同步双方序列号

序列号在 TCP 中非常重要:

  • 去除重复数据
  • 实现按序接收
  • 实现重传

采用两次握手,只能同步一方的序列号

避免资源浪费

避免历史连接 的情景是一样的

此外,为什么不是四次,这是因为,三次握手已经可以同步双方序列号,并且,可以确定信道是「可用」的,四次、五次… 只不过是增强了可信程度

为啥每次的初始 seq 不同?

主要是为了避免「过期」的报文对现有连接的混淆

在这里插入图片描述

图片来自小林 coding

如果每次的初始 seq 不同,就能 很大程度上 避免这个问题(不是完全避免,因为序列号是一个循环,下面会讲)

初始 seq 的产生算法?

ISN = M + F

  • M 是一个计时器,4us + 1
  • F 是一个哈希算法,取四元组的哈希值

为什么有了 MTU,TCP 还需要 MSS 来分片?

主要是为了减少重传的数据

假设 TCP 没有 MSS 来分片,如果一个 TCP 报文过长,在 IP 层也会被分片

正常情况,没有丢包,那当然没啥问题

但是,如果丢包,由于 TCP 的重传机制,会重传丢失的报文

由于 TCP 对 IP 分片(网络层)是无感的,因此,TCP 会 重传整个报文

如果 TCP 基于 MSS(MTU - IP 首部 - TCP 首部)分片,就可以保证在 IP 层不被分片,即使出现重传,也只需要重传丢失的片段,提高效率

第一、二、三次握手丢失,分别发生什么?

这里假设客户端是连接请求发起方

第一次握手丢失

客户端会重传 SYN 报文(Linux 默认重传 5 次),且每次的间隔时间指数递增(1、2、4…)

超过重传次数,客户端就会终止 TCP 连接

第二次握手丢失

对于客户端来说,与第一次握手丢失的情况是一样的

对于 Server 来说,超时未收到客户端的第三次握手,也会重传 ACK 报文

在这里插入图片描述

图片来自小林 coding

第三次握手丢失

对于 Server 来说,与第二次握手丢失情况是一样的

对于 Client 来说,第三次握手请求发出后,就进入了 ESTABLISHED 状态

Client 若想终止 TCP 连接,就只能依靠 TCP 的保活机制了

SYN 攻击是什么?如何减少 SYN 攻击带来的影响?

SYN 攻击是指:大量客户端向 Server 发起 TCP 连接请求,收到 Server 的 ACK 以后,始终不回答,导致 Server 的 半连接队列被打满,使 Server 无法处理正常客户端的连接请求

SYN 攻击也是一种 Dos 攻击

如何防御 SYN 攻击?

思路是保证半连接队列不被打满

  1. 防火墙:限制一个 IP 可以请求的客户端的数量
  2. 增加半连接队列的大小(调整 net.ipv4.tcp_max_syn_backlog、listen() 函数中的 backlog、net.core.somaxconn)
  3. 减少 SYN-ACK 的重传次数以及重传时间,使「半连接」快速释放
  4. 启用 SYN-Cookies

启用 SYN-Cookies 后,三次握手的过程:

  • 第二次握手,即使半连接队列满了,也不会丢弃连接,Server 计算出一个 cookie 值,放到 seq 中,发给 Client
  • 如果第三次握手,Client 的 ack 值合法,就加到 accept 的全连接队列中

在这里插入图片描述

图片来自小林 coding

TCP 连接断开

四次挥手过程

在这里插入图片描述

为什么是四次?可不可以是三次?

分析上图,可以发现:被动关闭连接方通常需要处理数据,看看有没有数据还要发送,ACK 和 FIN 是分开发的

因此,需要四次挥手

但是,在特定情况下,四次是可以变成三次的,即将 ACK 和 FIN 一起发送,但需要一定的条件:

  • 被动断开方需要开启 ACK 延迟确认机制(默认开启)
  • 被动断开方没有数据要传输

第一、二、三、四次挥手丢失,分别发生什么?

假设客户端主动终止连接

第一次挥手丢失

与 SYN 报文的重传一样,超时未收到 Server 的 ACK 后,客户端会重传 FIN 报文,最终强制关闭

第二次挥手丢失

客户端与第一次挥手丢失一样

在这里插入图片描述

Server 的 CLOSE_WAIT 结束后,发送 FIN 报文给 Client,但此时 Client 已经关闭,因此,Server 收不到 ACK,继续重传 FIN 直到重传上限

第三次挥手丢失

Server 会一直重传 FIN 报文直到重传上限

但 Client 就要分情况讨论了

如果 Client 是调用的 close 关闭的 TCP 连接:

在这里插入图片描述

如果 Client 是调用的 shutdown 关闭的 TCP 连接,由于 tcp_fin_timeout 无法控制 shutdown 关闭的连接,因此,Client 会一直处于 FIN_WAIT2 状态

第四次挥手丢失

在这里插入图片描述

图片来自小林 coding

为什么要有 TIME_WAIT?

保证被动关闭方能正确关闭

假设 Client 为主动关闭方

当 Client 发出对 Server 的 FIN 报文的 ACK(也就是第四次挥手)后,如果没有 TIME_WAIT,Client 就直接进入 CLOSED 状态

如果 ACK 丢失,Server 重传 FIN 给 Client,但 Client 已经关闭,因此会返回一个 RST 报文给 Server,导致 Server 的 TCP 连接不正常关闭

防止历史数据被下一次连接(同样四元组)接收

个人感觉这个的可能性比较小

在这里插入图片描述

图片来自小林 coding

要出现这种情况,至少满足两个条件的其中之一:

  • 历史数据传输时间很长很长,以至于初始 Seq 已经跑了一个循环
  • 传输速度很快,Seq 用得很快,以至于用完整个循环的 Seq

第一个情况可以说不可能发生(MSL 的概念)

第二个情况发生的可能性也很小

因此,TIME_WAIT 最主要的原因还是保证被动关闭方能正确关闭

为啥 TIME_WAIT 的时间为 2MSL?

MSL:最大报文生存时间,超过 MSL,可以认为一个彻底在网络中消失

如果 ACK 丢失了,被动关闭连接的一方会超时重传 FIN 报文

如果 TIME_WAIT 的时间是 2MSL,可以保证主动关闭连接的一方可以收到重传的 FIN 报文(ACK 过去消耗一个 MSL,重传的 FIN 回来,消耗一个 MSL),然后再次发送 ACK,让对方正确关闭

也就是说,2MSL 的时间至少允许 ACK 报文丢失一次

超过 2MSL 的时间也不是不可以,不过丢包率这么高的网络出现的概率太小了,忽略它比解决它更有性价比

TIME_WAIT 过多会怎么样?

无论对于客户端还是服务端来说,TIME_WAIT 过多,都会 占用资源

对于客户端来说,如果将所有可用的端口都用完了(都处于 TIME_WAIT 状态)就无法对相同的「目的 IP + 目的 Port」发起连接了

如何优化 TIME_WAIT?

TIME_WAIT 被设计出来,就不是用来优化掉的

相反,应该利用 TIME_WAIT 来保护我们的系统

服务器出现大量 TIME_WAIT 的原因?

出现 TIME_WAIT 的本质原因,还是因为 Server 主动关闭了 TCP 连接

  • 未启用 HTTP 长连接(或服务器禁用 keep-alive):服务器在发送完资源以后,会主动断开 TCP 连接
  • 客户端禁用 keep-alive
  • 启用了 HTTP 长连接,但是单个连接的请求数太多(nginx 超过 100 次,会断开该连接)

为啥客户端禁用 keep-alive,还是 Server 主动关闭连接呢?

这个问题要从系统调用来谈

如果是 Server 主动关闭,只需要一次系统调用(close)

如果是 Client 主动关闭

  1. Server 在写完最后一个 response 后,还是要调用 epoll/select 来监听 socket,
  2. 当 Client 调用 close 后,Server 这边产生 read 事件,发起 read 系统调用
  3. 发现连接被对方关闭,于是调用 close

一共是 3 次系统调用

因此,考虑到这一点,还是应该让 Server 主动关闭连接

服务器出现大量 CLOSE_WAIT 的原因?

这个主要是因为程序的 bug 问题(没有调用 close)

  1. 没有注册 server socket 到 epoll,产生 close 事件,server 也不知道
  2. 没有及时 accept 客户端请求,导致大量 Client 主动关闭连接
  3. accept 后,没有注册 clnt_sock 到 epoll 读事件
  4. 忘记调用 close

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

分两种情况:

  1. 二者之间有数据传输
  2. 二者之间没有数据传输

对于第一种情况,客户端挂了,server 由于收不到 ack,会持续重传直到最大重传次数,关闭连接

对于第二种情况,就只能依靠 TCP 的 keep-alive 机制了

默认保活时间是 2h

超过 2h,双方都没有通信过,就会启动 keep-alive 机制

keep-alive 机制会持续向对方发起一个探测报文,直到对方响应,或者达到最大重传次数

  • 默认间隔时间:75s
  • 默认最大重传次数:9

可以发现,TCP 的保活机制需要很长的时间才能断开一个「死亡」连接

因此,一般需要应用层的协议手动实现 heart-beat 机制

Socket 编程

针对 TCP,Server 的流程

  • 初始化 socket
  • bind
  • listen
  • accept
  • read/write
  • close

listen 的 backlog 的意义?

早期 Linux 内核 backlog 是 SYN 队列的容量,也就是「连接队列」容量。

但在 Linux 内核 2.2 之后,backlog 变成 accept 队列

也就是说,对于 2.2 之后的 Linux,backlog 的大小,决定了「全连接队列」的容量

但实际上,全连接队列的容量还取决于内核的 somaxconn 参数

因此,全连接队列实际容量是 min(somaxconn, backlog)

accept 发生在三次握手的哪一步?

发生在 server 收到 client 第三次握手时,即三次握手成功后

没有 accept,可以建立 TCP 连接吗?

可以

accept 发生在三次握手结束后,在 accept 前,TCP 连接就已经建立好了

没有 listen,可以建立 TCP 连接吗?

可以

存在两种情况:

  • TCP 自连接(自己连接自己)
  • 双方同时向对方发起连接

两种情况的共同点:没有服务端的参与,也就是没有 listen

水文预报新手别怕!用Matlab 18小时搞定马斯京根法参数K和x(附完整代码) 本文详细介绍了如何使用Matlab在18小时内快速掌握水文预报中的马斯京根法参数K和x的求解方法。通过完整的代码示例和分步解析,帮助新手从理论到实践快速跨越,解决传统手工试算耗时耗力的问题,提升水文预报的效率和精度。 阅读详情

相关推荐

数据仓库ODS层详解- 功能、设计与最佳实践

数据仓库ODS层是大数据分析的基石,为企业决策提供可靠数据源。本文深入探讨ODS层设计原则、实施要点和最佳实践,涵盖金融、零售等行业应用。重点关注云环境下ODS层部署策略,以及实时数据集成、数据湖技术等创新趋势。文章还分析了数据体量增长、实时性需求等挑战,提供实用解决方案。whether助您构建高效、安全、可扩展的ODS层,为数字化转型奠定坚实基础。#数据仓库 #ODS层 #大数据分析 #云计算 #数据湖

一个8年大数据开发工程师的碎碎念 1万+

tcp保活机制

tcp连接在一个时间段内没有任何活动,保活机制的作用下,隔段时间发送探测报文。

qq_60536984的博客 813

大数据利器Hadoop:从基础到实战,一篇文章掌握大数据处理精髓!

在当今大数据时代,数据量的爆炸式增长对企业和技术提出了前所未有的挑战。如何高效地存储、处理和分析这些庞大的数据集,成为了亟待解决的问题。Hadoop作为一种分布式计算框架,应运而生,为大数据处理提供了有效的解决方案。Hadoop是一个由Apache软件基金会维护的开源项目,它基于Google的分布式文件系统(Google File System,GFS)和MapReduce计算模型设计。Hadoop的主要目标是处理大规模数据集,它可以在普通硬件集群上运行,从而降低了大数据处理的成本。

邓邓子的博客 8061

TCP协议详解

文章目录TCP协议段格式TCP原理确认应答机制超时重传机制连接管理机制三次握手四次挥手:滑动窗口如果出现丢包,如何进行重传?流量控制拥塞控制延迟应答捎带应答粘包问题TCP异常情况 TCP,即Transmission Control Protocol,传输控制协议,对数据的传输进行详细的控制。 TCP协议段格式 源/目的端口号:表示数据从哪个进程来,到那个进程去。 源端口号表示报文的发送端口,源端口号和源IP地址组合起来可以表示报文的发送地址。 目的端口表示报文的接收端口,目的端口和目的IP地址组合起来可

m0_50370214的博客 4787

长连接和心跳包

第一种设置:通过设置socket的keepalive属性 #include    "/usr/include/linux/tcp.h" #include "/usr/include/linux/socket.h" ////KeepAlive实现,单秒 //下面代码要求有ACE,如果没有包含ACE,则请把用到的ACE函数改成linux相应的接口 int keepAlive = 1;//设

sctq8888的专栏 9549

网络协议--TCP的保活定时器

tcp

x13262608581的博客 1698

TCP 详解

上回说到 UDP 协议, 与之对应的便是 TCP 协议 TCP协议 TCP协议全称: 传输控制协议, 顾名思义, 就是要对数据的传输进行一定的控制. 先来看看它的报头 我们来分析分析每部分的含义和作用 源端口号/目的端口号: 表示数据从哪个进程来, 到哪个进程去. 32序号: 4首部长度: 表示该tcp报头有多少个4字节(32个bit) 6保留: 顾名思义, 先保留着, 以...

如故的博客 28万+

TCP/UDP协议特性以及TCP协议三次握手四次挥手

例如A向B传输数据完成向B发送断开连接的请求,B只能回复确认断开连接,但是此时不代表B也完成数据传输所以处于半连接状态,需要B向A发送断开连接请求,A返回确认断开连接才能完成断开连接。例如A向B发送请求连接时,B在回复确认连接时可以一起将B的请求连接发送给A,这样A只需要再回复一次确认连接就完成了建立连接。③PC2向PC1发送FIN报文和ACK报文,FIN=1、ACK=1、seq=z、ack=y+1(由于2次断开连接请求之间有等待时间,所以再次发送ACK确认报文,处于半连接状态,仍可传输数据)

Cloud034的博客 139

TCP 三次握手 / 四次挥手详解

本文系统解析了TCP协议的三大状态阶段:连接建立(三次握手)、数据传输和连接释放(四次挥手)。在连接建立阶段,详细说明了LISTEN、SYN_SENT、SYN_RCVD和ESTABLISHED状态的含义及转换条件;数据传输阶段重点分析ESTABLISHED状态特性;连接释放阶段则区分主动/被动关闭方的状态流转,特别是TIME_WAIT状态的2MSL等待机制及其必要性(确保可靠终止连接和避免旧报文干扰)。文章还通过HTTP请求场景完整展示了TCP状态流转过程,并针对CLOSE_WAIT和TIME_WAIT异常

2302_78913144的博客 574

TCP/UDP协议特性及TCP三次握手四次挥手过程

②PC2收到后会回复SNY,ACK的报文给PC1,随机生成序列号y,并要求PC1下次回复ack=x+1的序号,此时报文SNY=1,ACK=1,seq=y,ack=x+1。③PC1收到PC2同意连接的报文后会回复ACK,并生成序列号=x+1,确认号ack=y+1,此时报文ACK=1,seq=x+1,ack=y+1。②PC2返回ACK报文表示收到请求,并进入半连接状态,防止有数据没有下载完毕,此时ACK=1、seq=y、ack=x+1。确认号(ack):表示接收方希望发送方下一次发送的数据的编号。

2301_79932912的博客 76

TCP三次握手/四次挥手

作为例子,考虑计算机S和C之间的通信,假定C给S发送一个连接请求分组,S收到了这个分组,并发 送了确认应答分组。而关闭连接时,当Server收到Client发送的FIN报文时,仅仅表示Client不再发送数据给Server了但是还能接收来自Server的数据,而Server也未必降全部数据都发送给Client了,所以Server可以立即close,也可以发送一些数据给Client后,再发送FIN报文给Client来表示同意现在关闭连接,因此,Server ACK和FIN一般都会分开发送。

sre救赎之路 1204

TCP三次握手/四次挥手

TCP 在传输之前会进行三次沟通,一般称为“三次握手”;传完数据断开的时候要进行四次沟通,一般称为“四次挥手”。

黑曼巴 7852

UDP/TCP介绍、TCP三次握手四次挥手

关于UDP/TCP的学习在慕课网专栏《网络协议那些事儿》看到两篇文章,写的不错,在此处做个总结整理。 UDP协议 UDP/TCP协议是OSI七层网络模型中第四层传输层用到的协议,根据使用目的的不同,人们需要能分别达到以下两点要求: 传输简单快捷,但传输不可靠,有可能在传输过程中丢失数据报或者接收方没有正确接收数据(UDP)。 传输稳定可靠,每一次发送报文必须要求接收方对传输结果作出反馈,所以传输速度相对较慢(TCP)。 根据这两点要求,就有了现在的UDP/TCP协议。 先说说UDP协议,UDP(User

DaQiangZhuang的博客 848

【计算机网络TCP/UDP基础(简洁版)三次握手四次挥手

主要介绍TCP协议的三次握手四次挥手,简要介绍UDP协议、TCP与UDP的异同点……

一只菟葵的博客 824

一个抓包案例分析 TCP三次握手/四次挥手

点击上方关注 “终端研发部”设为“星标”,和你一起掌握更多数据库知识本文将展示如何使用 tcpdump 抓包,以及如何用 tcpdump 和 wireshark 分析网络流量。文中的例子比较简单,适合作为入门参考。1 基础环境准备为方便大家跟着上手练习,本文将搭建一个容器环境。1.1 Pull Docker 镜像$sudodockerpullalpine:3.81...

这个时代,作为程序员可能要学习小程序 577

TCP/UDP 简介,三次握手四次挥手

处于连接状态的客户端和服务端,都可以发起关闭连接请求。A 想主动结束连接,需要向 B 发送一次请求(FIN包),进入终止等待1状态(第一次挥手)B 收到后,返回一个 ACK 包,进入关闭等待状态,A进入终止等待2状态(第二次挥手)AB 此时还可以发送数据,B在数据接收完以后,返回 FIN 包,B进入关闭等待状态(第三次挥手)A 收到关闭信息后返回 ACK 包,并且进入超时等待状态,超时后关闭连接,B收到信息后回立即关闭连接(第四次挥手

Ashy- 在这里成长 818

大创项目之基于LLM和RAG技术的智能政务问答系统_利用大语言模型和检索增强生成技术构建的政务知识库智能问答平台_面向政府机构和公众提供高效精准的政务咨询服务_包含知识图谱构建_语.zip

大创项目之基于LLM和RAG技术的智能政务问答系统_利用大语言模型和检索增强生成技术构建的政务知识库智能问答平台_面向政府机构和公众提供高效精准的政务咨询服务_包含知识图谱构建_语.zip

FANUC数控系统31i-B PMC编程说明书(英文版).pdf

FANUC数控系统31i-B PMC编程说明书(英文版)

上一篇: HTTP 基础
下一篇: TCP 重传机制/滑动窗口/流量控制/拥塞控制
Sky_Lee_1
博客等级 码龄4年 129粉丝 · 22原创
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值