TCP协议(三次握手、流量控制、拥塞控制)

简介: TCP协议是一种可靠的传输层通信协议,通过三次握手建立连接,确保数据安全传输。流量控制通过接收窗口避免接收方缓冲区溢出,拥塞控制则利用拥塞窗口调节网络传输速度,防止网络拥堵。三者协同工作,保障TCP在复杂网络环境中实现高效、可靠的数据传输。

TCP协议简介

TCP(Transmission Control Protocol,传输控制协议)是一种面向连接的、可靠的、基于字节流的传输层通信协议。它的主要作用是在不可靠的网络环境中提供可靠的端到端数据传输服务。就好比在没有信号灯的繁忙道路上,TCP协议就像是一个交通管理员,确保数据包能够安全、完整地从发送方到达接收方。

TCP三次握手

概念

三次握手是TCP协议建立连接的过程,通过三次消息的交换来确保双方都能够正常收发数据,建立起可靠的通信链路。

第一次握手(SYN)

客户端(主动发起连接的一方)向服务器(被动等待连接的一方)发送一个TCP报文段,这个报文段的标志位中的SYN(同步序列号)被置为1。同时,客户端会随机选择一个初始序列号(ISN),这个序列号就像是一个独特的标签,用于后续数据传输中的数据包排序和确认。

通俗理解:客户端就像是在敲门,对服务器说:“嘿,我想和你建立连接,这是我的一个标记(初始序列号),你记一下。”

第二次握手(SYN - ACK)

服务器收到客户端的SYN报文后,会回复一个TCP报文段。这个报文段有两个关键标志位:SYN和ACK(确认)。服务器会将SYN置为1,表示它也想建立连接;同时,它会将ACK置为1,并且在确认号字段中写上客户端初始序列号加1(ISN + 1),这是对客户端的确认。服务器也会随机选择自己的初始序列号。

通俗理解:服务器回应敲门的人(客户端):“好的,我知道你想建立连接,我记下了你的标记(客户端初始序列号),并且我也有了自己的标记(服务器初始序列号),我们继续吧。”

第三次握手(ACK)

客户端收到服务器的SYN - ACK报文后,会发送一个TCP报文段,将ACK置为1,并且在确认号字段中写上服务器初始序列号加1(服务器ISN + 1)。这样就完成了三次握手。

通俗理解:客户端对服务器说:“我收到了你的标记(服务器初始序列号),现在我们正式建立连接,可以开始传输数据了。”

作用

确保双方都准备好:通过三次握手,可以确认客户端和服务器的发送和接收功能是否正常。如果其中一方的网络有问题或者没有准备好,这个过程就会失败,避免了盲目地传输数据。

同步序列号:通过交换初始序列号,为后续的数据传输提供了基础。序列号在TCP中非常重要,它用于数据包的排序、确认和丢包重传等机制。

TCP流量控制

概念

TCP流量控制是防止发送方发送的数据过多,导致接收方无法及时处理而出现数据溢出(接收缓冲区溢出)的一种机制。就好比一个水管往桶里注水,如果注水的速度太快,超过了桶的容纳速度,水就会溢出来。

原理

接收窗口(rwnd)

接收方有一个接收缓冲区,用于暂时存放接收的数据。接收方会告诉发送方自己的接收窗口大小,这个大小表示接收方能够接收的数据量。接收窗口的大小是动态变化的,它取决于接收方的处理能力和缓冲区的剩余空间。

通俗理解:接收方就像是一个仓库管理员,他告诉发送方(送货员)仓库还能容纳多少货物(数据)。如果仓库快满了,他就会缩小接收窗口,让送货员慢点送;如果仓库腾出空间了,他就会增大接收窗口。

滑动窗口协议

发送方根据接收方的接收窗口大小来控制自己的发送速度。发送方维护一个发送窗口,这个窗口的大小不能超过接收方的接收窗口。发送方只能在这个窗口范围内发送数据。

例如,接收方的接收窗口大小是1000字节,发送方的发送窗口也是1000字节。发送方可以发送1000字节的数据,当发送方发送了部分数据后,它会等待接收方的确认。接收方确认收到数据后,会更新接收窗口的大小,并告诉发送方。发送方根据新的接收窗口大小调整自己的发送窗口,继续发送数据。

通俗理解:发送方就像是在一条传送带上放货物(数据),传送带的长度(发送窗口)取决于接收方仓库的容纳能力(接收窗口)。如果接收方仓库满了,传送带就会缩短,发送方就不能放太多货物;如果仓库有空间,传送带就会变长,发送方可以多放货物。

四、TCP拥塞控制

概念

TCP拥塞控制是防止过多的数据注入到网络中,避免网络拥塞的一种机制。网络拥塞就像交通堵塞,当过多的车辆(数据)涌入道路(网络链路)时,会导致数据传输延迟增加、丢包等问题。

原理

拥塞窗口(cwnd)

发送方除了考虑接收方的接收窗口外,还会维护一个拥塞窗口。拥塞窗口是根据网络的拥塞情况动态调整的。发送方在发送数据时,需要同时考虑接收窗口和拥塞窗口,实际的发送窗口大小是接收窗口和拥塞窗口中的较小值。

通俗理解:拥塞窗口就像是发送方根据道路(网络)的交通状况(网络拥塞情况)给自己设定的一个限制。如果道路很畅通,拥塞窗口可以比较大;如果道路拥堵,拥塞窗口就会缩小。

拥塞控制算法

慢启动阶段:在连接刚建立或者发生拥塞后恢复时,发送方会将拥塞窗口设置为一个较小的值(通常是1个最大报文段长度MSS)。每收到一个确认,拥塞窗口就增加1个MSS。这个阶段窗口增长速度很快,就像汽车刚启动时加速比较快。

拥塞避免阶段:当拥塞窗口达到一个阈值后,进入拥塞避免阶段。这个阶段窗口增长速度变慢,每收到一个确认,拥塞窗口增加1/cwnd(cwnd是当前拥塞窗口大小)。这个阶段就像汽车在高速公路上匀速行驶,速度不会太快。

拥塞发生时的处理:如果发送方发现有丢包(通过超时重传或者收到重复确认等方式判断),就会认为网络拥塞发生了。此时,发送方会将拥塞窗口减半,并且将阈值设置为当前拥塞窗口的一半,然后重新进入慢启动阶段。这个过程就像是发现道路拥堵,汽车紧急刹车,然后重新调整速度慢慢行驶。

通俗理解:拥塞控制算法就像是一个智能的司机,根据道路的拥堵情况调整车速。如果道路畅通,就加速行驶;如果发现拥堵迹象,就减速甚至刹车,等道路情况好转后再慢慢加速。

五、三者的联系

TCP三次握手是建立连接的基础,为数据传输提供了可靠的通道。流量控制和拥塞控制是在数据传输过程中发挥作用的机制。流量控制主要关注接收方的处理能力,防止接收方溢出;拥塞控制主要关注网络的传输能力,防止网络拥塞。三者共同协作,确保了TCP协议能够在复杂的网络环境中实现可靠、高效的数据传输。

目录
相关文章
|
网络协议 算法 网络性能优化
TCP滑动窗口、流量控制及拥塞控制详解
TCP滑动窗口、流量控制及拥塞控制详解
|
设计模式 存储 前端开发
MVVM、MVC、MVP三种常见软件架构设计模式的区别
MVC、MVP 和 MVVM 是三种常见的软件架构设计模式,主要通过分离关注点的方式来组织代码结构,优化开发效率。
1060 12
|
Ubuntu Linux 编译器
Linux应用开发基础知识——交叉编译与gcc编译(一)
Linux应用开发基础知识——交叉编译与gcc编译(一)
747 0
Linux应用开发基础知识——交叉编译与gcc编译(一)
|
6月前
|
存储 网络协议 网络虚拟化
交换机工作原理(MAC地址表、VLAN)
交换机是局域网中的核心设备,工作在OSI模型的数据链路层,通过MAC地址表和VLAN技术实现高效的数据帧转发与网络隔离。其基本原理包括根据目的MAC地址智能转发数据帧,利用MAC地址学习、老化机制维护地址表。同时,VLAN(虚拟局域网)技术可将网络划分为多个逻辑子网,提供流量隔离、增强安全性和灵活管理等功能。实际应用中,交换机与VLAN广泛用于企业、学校和数据中心等场景,满足不同用户群体的需求并优化网络性能。
532 8
|
6月前
|
域名解析 网络协议 安全
计算机网络TCP/IP四层模型
本文介绍了TCP/IP模型的四层结构及其与OSI模型的对比。网络接口层负责物理网络接口,处理MAC地址和帧传输;网络层管理IP地址和路由选择,确保数据包准确送达;传输层提供端到端通信,支持可靠(TCP)或不可靠(UDP)传输;应用层直接面向用户,提供如HTTP、FTP等服务。此外,还详细描述了数据封装与解封装过程,以及两模型在层次划分上的差异。
1016 13
|
6月前
|
存储 网络协议 数据安全/隐私保护
SMTP/POP3/IMAP(电子邮件协议)
本文介绍了电子邮件系统中常用的三种协议:SMTP、POP3 和 IMAP。SMTP(简单邮件传输协议)用于发送邮件,设计简单且广泛支持;POP3(邮局协议版本3)用于接收邮件,适合离线使用但不支持文件夹管理;IMAP(互联网消息访问协议)允许用户在服务器上管理邮件,支持多设备同步和部分下载。文章还对比了这三种协议的功能、端口及特点,并分析了它们在实际场景中的应用,帮助用户根据需求选择合适的协议。
2354 24
|
6月前
|
网络协议 安全 算法
路由协议(静态路由、RIP、OSPF、BGP)
本文介绍了四种常见的路由协议:静态路由、RIP、OSPF 和 BGP。静态路由由管理员手动配置,简单安全但缺乏动态性;RIP 是距离矢量协议,适合小型网络,实现简单但收敛慢且易产生环路;OSPF 基于链路状态算法,适用于中大型网络,快速收敛且无环路,但配置复杂;BGP 是路径矢量协议,主要用于自治系统间路由选择,策略性强、稳定性高,但配置难度大且依赖人工干预。根据网络规模和需求,可选择合适的路由协议。
890 9
undefined reference to symbol 'dlsym@@GLIBC_2.17' libdl.so: error adding symbols: DSO missing from c
undefined reference to symbol 'dlsym@@GLIBC_2.17' libdl.so: error adding symbols: DSO missing from c
884 0
|
7月前
|
存储 Windows
新电脑硬盘如何分区?新手一步一步轻松搞定
新电脑硬盘如何分区?新手一步一步轻松搞定
|
12月前
|
监控 Java
线程池大小如何设置
在并发编程中,线程池是一个非常重要的组件,它不仅能够提高程序的响应速度,还能有效地利用系统资源。合理设置线程池的大小对于优化系统性能至关重要。本文将探讨如何根据应用场景和系统资源来设置线程池的大小。