【网络】TCP为什么采用三次握手?而不是两次,四次

2024-05-04 13:44

本文主要是介绍【网络】TCP为什么采用三次握手?而不是两次,四次,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

TCP(Transmission Control Protocol)是一种可靠的、面向连接的通信协议,它在建立连接时采用了三次握手的机制。这种设计并非偶然,而是为了确保连接的可靠性、安全性和效率。下面我们详细解释为什么TCP要采用三次握手。主要就是看两次握手会有什么问题

1. 防止历史连接的混淆

在TCP的通信中,客户端和服务器之间可能存在多次尝试建立连接的情况。假设客户端发送了一个连接请求,但由于网络故障或其他原因,服务器未能及时响应,而客户端此时又发起了一个新的连接请求。如果仅采用两次握手,服务器收到后会误以为是同一个连接请求,从而可能建立多个重复的连接,造成资源的浪费和混乱。

什么是历史连接
历史连接指的是在网络通信中曾经建立过但目前已经结束或未完成的连接。这种连接可能由于网络故障、通信延迟、客户端或服务器故障等原因而未能正常完成。历史连接的产生情况有以下几种:

  1. 网络故障导致连接丢失:在进行TCP连接的过程中,如果通信的某个阶段出现网络故障,比如连接请求或连接响应的数据包丢失,那么这个连接可能会留下历史记录,即历史连接。

  2. 客户端或服务器故障:如果客户端或服务器在连接建立的过程中发生故障,可能导致连接未能正常完成,但在另一端仍然存在相关的连接记录,这也会形成历史连接。

  3. 连接超时或关闭:有时候,一个连接在一定时间内未能完成建立或数据传输,可能会被视为超时而关闭。这样的连接也会被记录为历史连接。

  4. 重复的连接请求:客户端可能会多次发送连接请求,但只有一次能够成功建立连接,其他的连接请求可能会被视为历史连接。

  5. 网络拥塞或延迟:在网络拥塞或延迟较高的情况下,连接建立过程可能会受到影响,导致连接未能正常完成,形成历史连接。

2. 确保双方的初始序列号同步

在TCP通信中,每个数据包都包含一个序列号,用于标识数据包的顺序和完整性。在连接建立阶段,双方需要协商初始的序列号,以便后续的数据传输能够正确解析。通过三次握手,客户端和服务器可以互相确认对方的序列号,并达成一致,保证了后续数据传输的正确性和顺序性。

3. 避免不必要的连接建立,防止受到SYN洪泛攻击

在TCP的通信过程中,一次连接建立后,双方会维持一段时间的连接状态,这需要消耗一定的资源。如果客户端发送的连接请求在网络中被丢失或延迟,而服务器未能及时收到,如果采用两次握手,服务器可能会误以为客户端要建立连接,并创建了连接状态。通过三次握手,客户端和服务器都会确认对方的意图后才建立连接,避免了不必要的连接建立,节约了资源。

总结

不使用「两次握手」和「四次握手」的原因:

「两次握手」:无法防止历史连接的建立,会造成双方资源的浪费,也无法可靠的同步双方序列号,且容易收到攻击。
「四次握手」:三次握手就已经理论上最少可靠连接建立,所以不需要使用更多的通信次数。

这篇关于【网络】TCP为什么采用三次握手?而不是两次,四次的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/959334

相关文章

hdu1254(嵌套bfs,两次bfs)

/*第一次做这种题感觉很有压力,思路还是有点混乱,总是wa,改了好多次才ac的思路:把箱子的移动当做第一层bfs,队列节点要用到当前箱子坐标(x,y),走的次数step,当前人的weizhi(man_x,man_y),要判断人能否将箱子推到某点时要嵌套第二层bfs(人的移动);代码如下:

Linux 网络编程 --- 应用层

一、自定义协议和序列化反序列化 代码: 序列化反序列化实现网络版本计算器 二、HTTP协议 1、谈两个简单的预备知识 https://www.baidu.com/ --- 域名 --- 域名解析 --- IP地址 http的端口号为80端口,https的端口号为443 url为统一资源定位符。CSDNhttps://mp.csdn.net/mp_blog/creation/editor

ASIO网络调试助手之一:简介

多年前,写过几篇《Boost.Asio C++网络编程》的学习文章,一直没机会实践。最近项目中用到了Asio,于是抽空写了个网络调试助手。 开发环境: Win10 Qt5.12.6 + Asio(standalone) + spdlog 支持协议: UDP + TCP Client + TCP Server 独立的Asio(http://www.think-async.com)只包含了头文件,不依

poj 3181 网络流,建图。

题意: 农夫约翰为他的牛准备了F种食物和D种饮料。 每头牛都有各自喜欢的食物和饮料,而每种食物和饮料都只能分配给一头牛。 问最多能有多少头牛可以同时得到喜欢的食物和饮料。 解析: 由于要同时得到喜欢的食物和饮料,所以网络流建图的时候要把牛拆点了。 如下建图: s -> 食物 -> 牛1 -> 牛2 -> 饮料 -> t 所以分配一下点: s  =  0, 牛1= 1~

poj 3068 有流量限制的最小费用网络流

题意: m条有向边连接了n个仓库,每条边都有一定费用。 将两种危险品从0运到n-1,除了起点和终点外,危险品不能放在一起,也不能走相同的路径。 求最小的费用是多少。 解析: 抽象出一个源点s一个汇点t,源点与0相连,费用为0,容量为2。 汇点与n - 1相连,费用为0,容量为2。 每条边之间也相连,费用为每条边的费用,容量为1。 建图完毕之后,求一条流量为2的最小费用流就行了

poj 2112 网络流+二分

题意: k台挤奶机,c头牛,每台挤奶机可以挤m头牛。 现在给出每只牛到挤奶机的距离矩阵,求最小化牛的最大路程。 解析: 最大值最小化,最小值最大化,用二分来做。 先求出两点之间的最短距离。 然后二分匹配牛到挤奶机的最大路程,匹配中的判断是在这个最大路程下,是否牛的数量达到c只。 如何求牛的数量呢,用网络流来做。 从源点到牛引一条容量为1的边,然后挤奶机到汇点引一条容量为m的边

配置InfiniBand (IB) 和 RDMA over Converged Ethernet (RoCE) 网络

配置InfiniBand (IB) 和 RDMA over Converged Ethernet (RoCE) 网络 服务器端配置 在服务器端,你需要确保安装了必要的驱动程序和软件包,并且正确配置了网络接口。 安装 OFED 首先,安装 Open Fabrics Enterprise Distribution (OFED),它包含了 InfiniBand 所需的驱动程序和库。 sudo

【机器学习】高斯网络的基本概念和应用领域

引言 高斯网络(Gaussian Network)通常指的是一个概率图模型,其中所有的随机变量(或节点)都遵循高斯分布 文章目录 引言一、高斯网络(Gaussian Network)1.1 高斯过程(Gaussian Process)1.2 高斯混合模型(Gaussian Mixture Model)1.3 应用1.4 总结 二、高斯网络的应用2.1 机器学习2.2 统计学2.3

【Go】go连接clickhouse使用TCP协议

离开你是傻是对是错 是看破是软弱 这结果是爱是恨或者是什么 如果是种解脱 怎么会还有眷恋在我心窝 那么爱你为什么                      🎵 黄品源/莫文蔚《那么爱你为什么》 package mainimport ("context""fmt""log""time""github.com/ClickHouse/clickhouse-go/v2")func main(

网络学习-eNSP配置NAT

NAT实现内网和外网互通 #给路由器接口设置IP地址模拟实验环境<Huawei>system-viewEnter system view, return user view with Ctrl+Z.[Huawei]undo info-center enableInfo: Information center is disabled.[Huawei]interface gigabit