tcp,状态. from异常流程

本文详细解析TCP的11种状态及其转换机制,并探讨了连接建立与断开的过程、保活机制、重传机制等内容。同时,针对TCP通信过程中的常见异常情况进行总结,包括连接池中的TCP超时案例、被动关闭后的读取行为、状态不符时的数据更新等问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

基础: TCP11种状态_哆啦尼可夫的博客-优快云博客_tcp状态

如何理解状态图, 缺少一个 rst 状态,类似于 closed. 几个观点

   1. syn,ack或者 fin,ack 可以同时发送, 但是接受需要分别接收来设计状态.
   2. Fin 这种是需要业务端触发的, ack ,rst ,syn 这种是 tcp 协议本身自动触发的.
   3. 建连的时候分服务端,客服端. 由于 tcp 是双工的, 后续数据传输和关闭连接不分服务端,客服端.
   4. 其他深入观点, 4.1 经过lvs dr负载均衡的连接是三角形. [对栈连接池不友好] 4.2 lvs 的负载均衡是在连接时完成的.
   5. lvs 其实也是监听了端口,但是其接受到了 syn 后,不返回 ack,而是转发了 syn 数据. 相当于没有使用 tcp 协议,拦截处理了.

为什么连接三次就够了, 断开要四次?

  三次是因为 ack和发送请求请求合并在一起了. 

   讲讲这里的异常情况,幂等!

       客户端进入连接状态后, 服务端还会一直发送ack过来, 会怎么样?  此时客户端已经established.  有没有唯一标识.

a b c三个包, b c没有收到?

     1. bc 收到,  a没有收到,怎么办?

     2. 收到了, 怎么排序.

          tcp 序列号_tcp序列号_个人渣记录仅为自己搜索用的博客-优快云博客

     3. 此时有个d, 还需要发么?

     4. a一直没有成功怎么办?

     5. 如果文件很大,序号超了,怎么办? 如果速度非常快呢, 内存非常大, 已经超过int最大值了, 第一个包还在途, 包冲突怎么办? 自定义协议,采用string字符串. 包的大小调大.

   6. 当前网络性能变好后,包的大小是否可以调大

   7. 为什么tcp不建议大包发送? 1.网络性能  2.packet大小

udp/tcp 区别? tcp 精准, 不可丢. udp可丢, 视频类, 只是模糊了. 

tcp重传和udp视频传输_视频 tcp重传_个人渣记录仅为自己搜索用的博客-优快云博客

  TCP的保活机制

 TCP中的保活机制是一个可选项,并不是必须的。
  主要用在服务器端,用于检测已建立TCP链接的客户端的状态,防止因客户端崩溃或者客户端网络不可达,而服务器端一直保持该TCP链接,占用服务器端的大量资源(因为Linux系统中可以创建的总TCP链接数是有限制的)。
  保活机制原理:设置TCP保活机制的保活时间keepIdle,即在TCP链接超过该时间没有任何数据交互时,发送保活探测报文;设置保活探测报文的发送时间间隔keepInterval;设置保活探测报文的总发送次数keepCount。如果在keepCount次的保活探测报文均没有收到客户端的回应,则服务器端即关闭与客户端的TCP链接。
  保活探测报文:
  TCP保活探测报文的内容为,将之前已发送数据的最大序列号序列的减1,并设置数据大小为1个字节,数据内容为“0”,然后发送到客户端,如下图所示

  TCP通信过程中异常情况整理_tcp常见故障_自由不死的博客-优快云博客

重传和包活关系?

  如上

重传滑动窗口和拥塞控制 关系?

  https://www.cnblogs.com/wxdlut/p/13569700.html

网络原理:网原第一次实验:滑动窗口协议(Netriver平台) https://www.jianshu.com/p/1f092f1acd58

案例1: 连接池中的 tcp 超时案例.  更复杂是防火墙断开长连接. 牛在看堆栈发现问题. [3]

案例2: 被动 close 后, 照样可以 read,但是返回-1. 代表不可能有新的流了. 原因自身的状态已经是 close_wait. 自己主动 close 的,再 read 会抛已关闭. [4]

案例3: 如果状态不符合,更新数据.会导致 connection 被 reset . 上一次 rst 后下一次应该判断在状态, 连接正常才能往里面发送数据. 然后再次写时,直接抛错broken pipe . 这种情况一般发生在客户进程不理会(或未及时处理)Socket 错误,继续向服务 TCP写入更多数据时. 有可能 flush 成功,但是对方未收到数据的情况. 所以发送成功,要看 ack 信息(应用层是 返回 success 信息),不能单方便认为发送成功. [4]

5] 从 lvs 角度再来谈tcp 连接状态_lvs搭建tcp后,端口状态_个人渣记录仅为自己搜索用的博客-优快云博客

tcp 连接,黑洞,超时_个人渣记录仅为自己搜索用的博客-优快云博客

### 可能的原因分析 当在 Windows 下运行 Docker 容器时,如果遇到 `An attempt was made to access a socket in a way forbidden by its access permissions` 的错误提示,通常可能由以下几个原因之一引起: 1. **端口已被占用**:尽管通过 `netstat -aon | findstr :9381` 查看未发现有进程占用了该端口,但仍可能存在其他隐藏的冲突情况[^3]。 2. **WinNAT 配置问题**:Windows NAT 服务可能出现异常状态,导致无法正常分配或绑定所需端口[^5]。 3. **动态端口范围冲突**:某些情况下,操作系统默认的动态端口范围可能导致与特定静态端口之间的冲突。可以通过调整动态端口范围来规避此问题[^4]。 --- ### 解决方案 #### 方法一:检查并释放潜在占用的端口 即使初步排查显示无明显占用,仍需进一步确认是否存在隐性冲突。可尝试以下步骤: ```bash netstat -abn | findstr :9381 ``` 若发现任何程序正在使用目标端口,则记录其 PID 并终止对应进程: ```bash taskkill /PID <PID> /F ``` #### 方法二:重置 WinNAT 服务 停止并重新启动 WinNAT 服务有助于修复因 NAT 层面引发的端口映射问题: ```bash net stop winnat net start winnat ``` #### 方法三:修改动态端口范围 有时,默认的动态端口范围会干扰到固定使用的端口号(如 9381)。可通过如下方式查询当前动态端口范围,并对其进行合理调整: ```bash # 查询现有动态端口范围 netsh int ipv4 show dynamicport tcp # 设置新的动态端口起始值和数量(避开常用业务端口) netsh int ipv4 set dynamicport tcp start=10000 num=50000 ``` 完成更改后建议重启计算机以使改动生效。 #### 方法四:验证防火墙规则 确保本地防火墙策略允许外部访问至指定端口。对于测试环境而言,临时关闭防火墙亦是一种快速排除手段;但在生产环境中应谨慎处理此类操作。 #### 方法五:切换宿主机网络适配器模式 部分场景下更换为桥接网卡或者启用更多高级选项也可能缓解类似状况的发生几率。 --- ### 示例脚本 以下是综合以上各点的一个自动化检测与修正流程示例代码片段: ```powershell # PowerShell 脚本用于自动诊断及解决常见Docker端口绑定失败问题 Write-Output "Stopping and restarting WinNAT service..." Stop-Service winnat Start-Sleep -Seconds 5 Start-Service winnat $targetPort = 9381 Write-Output "Checking if port $targetPort is occupied..." $processInfo = Get-NetTCPConnection -LocalPort $targetPort -ErrorAction SilentlyContinue if ($null -ne $processInfo) { Write-Warning "Process $($processInfo.OwningProcess) occupies the target port." Stop-Process -Id $processInfo.OwningProcess -Force } Write-Output "Adjusting system's dynamic port range settings..." Invoke-Expression "netsh int ipv4 set dynamicport tcp start=10000 num=50000" Restart-Computer -Confirm:$false ``` --- ###
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值