linux TCP滑动窗口 四次挥手
TCP滑动窗口
滑动窗口(Sliding window)是一种流量控制技术。早期的网络通信中,通信双方不会考虑网络的拥挤情况直接发送数据。由于大家不知道网络拥塞状况,同时发送数据,导致中间节点阻塞掉包,谁也发不了数据,所以就有了滑动窗口机制来解决此问题。滑动窗口协议是用来改善吞吐量的一种技术,即容许发送方在接收任何应答之前传送附加的包。接收方告诉发送方在某一时刻能送多少包(称窗口尺寸)。
TCP中采用滑动窗口来进行传输控制,滑动窗口的大小意味着接收方还有多大的缓冲区可以用于接收数据。发送方可以通过滑动窗口的大小来确定应该发送多少字节的数据。当滑动窗口为 0 时,发送方一般不能再发送数据报。
滑动窗口是 TCP 中实现诸如 ACK确认、流量控制、拥塞控制的承载结构。
窗口理解为缓冲区的大小
滑动窗口的大小会随着发送数据和接收数据而变化
通信双方都有发送数据缓冲区和接收数据的缓冲区
服务器:
发送缓冲区(发送缓冲区的窗口)
接收缓冲区(接收缓冲区的窗口)
客户端:
发送缓冲区(发送缓冲区的窗口)
接收缓冲区(接收缓冲区的窗口)
发送方的缓冲区:
白色格子:空闲的空间
灰色格子:数据已经被发送出去,但是还没有被接收(没有收到ACK确认回应)
粉色格子:还未发送出去的数据
接收方的缓冲区:接收方回信息给发送方的时候(会发送自身还有多大空闲空间)
白色格子:空闲的空间
粉色格子:已经接收到的数据
第一次握手不能携带通信的数据,第一次握手仅是建立连接,第二次也不能携带数据,第三次握手可以携带一些数据
sender:SYN连接请求,序号0,数据0,滑动窗口大小4096,一条数据最大1460
receiver:SYN连接请求,序号8000,数据0,ACK确认,滑动窗口大小6144,数据最大1024
sender:ACK 8001(8000+1)确认,目前滑动窗口大小4096
# mss: Maximum Segment Size(一条数据的最大的数据量)
# win: 滑动窗口 (TCP16位窗口大小)
1. 客户端向服务器发起连接,客户端的滑动窗口是4096,一次发送的最大数据量是1460
2. 服务器接收连接情况,告诉客户端服务器的窗口大小是6144(6K),一次发送的最大数据量是1024
3. 第三次握手
4. 4-9 客户端连续给服务器发送了6k的数据,每次发送1k
5. 第10次,服务器告诉客户端:发送的6k数据以及接收到,存储在缓冲区中,缓冲区数据已经处理了2k,窗口大小是2k
6. 第11次,服务器告诉客户端:发送的6k数据以及接收到,存储在缓冲区中,缓冲区数据已经处理了4k,窗口大小是4k
7. 第12次,客户端给服务器发送了1k的数据
8. 第13次,客户端主动请求和服务器断开连接,并且给服务器发送了1k的数据
9. 第14次,服务器回复ACK 8194(7169 + 1024 + FIN(1)), a:同意断开连接的请求 b:告诉客户端已经接受到方才发的2k的数据 c:滑动窗口2k
10.第15、16次,通知客户端滑动窗口的大小
11.第17次,第三次挥手,服务器端给客户端发送FIN,请求断开连接
12.第18次,第四次挥手,客户端同意了服务器端的断开请求
TCP四次挥手:
四次挥手发生在断开连接的时候,在程序中当调用了 close() 会使用TCP协议进行四次挥手。
客户端和服务器端都可以主动发起断开连接,谁先调用 close() 谁就是发起方
因为在TCP连接的时候,采用三次握手建立的连接是双向的,在断开的时候也需要双向断开。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· .NET10 - 预览版1新功能体验(一)