TCP和UDP的那些事儿

本文深入探讨TCP和UDP的特性及应用场景,分析两者在可靠性、流量控制、拥塞避免等方面的差异,解释为何某些任务更适合UDP而非TCP。

文章开始之前我们先抛出几个问题:

  • 大家都说TCP比UDP可靠,是这样吗?如果真是这样,那么TCP的可靠性体现在哪儿或者说TCP的可靠性通过什么手段来保证。
  • UDP不如TCP可靠,那么为什么数据的传输不全采用TCP的方式,非要给UDP分一杯羹呢?
  • 我们都知道数据包的分片,为什么数据包的分片的任务没有交给传输层而是放在了网络层进行,其中难道有什么不可描述的交易?
  • TCP的实现连接的建立要经过三次握手,为什么是三次?两次行不行?

下面我们将根据这些问题,做一些简单的解释:

首先我们来看一下UDP:

  • 概念

    • UDP是一个简单的传输层控制协议,它是无连接的数据报协议。UDP不保证会到达最终目的地,同时它也不保证各个数据报的先后顺序跨网络后保持不变,不保证相同的数据报只到达一次,由此我们可以看出UDP的不可靠性。比起TCP协议的流式特性,每个UDP的数据报都有一个长度,当对端收到数据报,该长度也将传递给对端的应用进程。
    • 下面我们来解剖一下UDP,看一下它的首部构造:
      在这里插入图片描述
    • 每个UDP的首部前面会额外的增加一个伪首部,用来传输层数据报的差错校验。
  • 应用

    • DNS域名解析
      UDP是一个不可靠的协议,为什么域名解析这么重要的工作不交给TCP来完成而是UDP呢?我们知道TCP在真正开启数据请求之前要先建立连接,也就是我们常说的三次握手。当然可靠性的建立必然以牺牲其他利益为代价,对于TCP而言,这代价便是时间,UDP在时间的观念上便更胜一筹,当然完成域名解析一个数据报也足矣,所以使用UDP何乐而不为呢。
    • QQ聊天数据的发送(此处并不包含大型文件的传送)
    • 屏幕广播(英语听力课不就是这种方式嘛)

接着我们来看一下 TCP:

  • 概念

    • TCP是一种面向连接的、可靠的、字节流协议。基于TCP的流式特性,所以这就要求用户自己来规划协议,划定消息边界。目前常见的方式有三种:

      • 在每个要发的数据报之前附加一个数据长度,对端通过阻塞的方式进行读或写操作,直至数据结束。
      • 设定一个特殊的结束标志比如像HTTP的结束标志 \r\n
      • 每次发一个固定长度的数据报,对端也每次接受相等的数据内容。
    • 同样的我们来解剖一下TCP看一下它的首部:
      在这里插入图片描述

  • 可靠性保证

    • 三次握手机制建立连接
      首先我们来看一下三次握手的过程:
      在这里插入图片描述
      首先客户端会先向服务器发送一个数据请求,也就是SYN分节,该数据报含了数据的初始序列号、接受窗口,拥塞窗口、接受缓存的大小以及相应网卡所支持的最大数据大小等信息,同样的服务器会针对客户端的请求做一个相应的回应。接着客户端会根据服务器的回应也相应的回复一个ack消息,至此连接成功建立。

    你可能会有这样的疑问,握手为什么非得三次,如果说因为TCP是全双工的,需要双方先自报家门,两次完全就够了,
    为什么最后还要再经过客户端的一次确认,这不是多余的吗?这样的疑问不是没有道理,我们先来看一个场景:
    

    如果路由器在转发客户端的第一次请求的数据报的时候,选择了一条比较长的网络路径,数据报并没有及时传给服务器。一段时间后(小于数据报的存活时间)客户端收不到来自于服务器的回应,于是重传了一次数据报,这次发送的数据报及时送给服务器,相应的客户端也及时收到了来自于服务器的回应。这个时候客户端第一次发送的数据报经历重重险阻终于到达了服务器,服务器以为客户端又发起了一个建立连接的请求,于是给客户端一个回应。由于客户端此前已经收到了此次回应,所以对服务器刚刚的回应不予理睬,服务器以为客户端没有收到自己的回应于是重传。。。。。这种情况将导致服务器的资源被长期占用这不是我们所乐意看到的。而三次握手则很好的避免了这种情况的发生。

    • 数据报的错误重传
      这个不言而喻,在此也不再赘述。

    • 流量控制
      说流量控制之前我们先讲一讲信道利用率,我们先来看一张图片
      在这里插入图片描述

      • 其中Td是数据报发送时间,Ta指数据报接收时间,RTT指数据报往返时间
        现在从客户端B到客户端A数据报经历的总时间T = Ta + Td + RTT;其中信道利用率可看似 = Td / T,图中我们可以看出大量的时间用来等数据报,这样是不划算的。有什么比较经济的做法呢?没错,我们可以通过不间断的发送数据报来进一步提高信道利用率,这就是所谓的滑动窗口技术。
        我们来看一张接收窗口的结构图在这里插入图片描述

      • 为了便于叙述,我们先将发送方规定为A,接收方为B
        和B一样,相应的A存在一个接收窗口大小,A的发送窗口大小由A的拥塞窗口大小和B的接收窗口大小共同决定(二者取其较小值),要说明的是发送窗口的大小受不同的网络环境和接收方的接收缓存大小的影响,也就是说TCP可以根据实际的网络情况通过动态调整各类窗口的大小来实现对流量的控制。

      • 拥塞避免

        • 拥塞的条件:对资源的需求总和 > 可用资源
          相比于流量控制,拥塞现象是多台客户机不断发数据报导致路由器承受太多的负荷甚至死机而造成的网络拥堵。我们来看一张图:
          在这里插入图片描述
          我们可以看到没有拥塞控制的网络环境是非常危险的,甚至会导致网络环境彻底瘫痪。那么TCP是怎样避免这种现象呢?早些年TCP采用慢开始算法来规避这问题,现在更多的是采用快重传、快恢复的方法。至于这两种算法的具体介绍有兴趣的小伙伴可以自己学习,在此就不再赘述。

为什么数据报分片的重任交给了网络层?

  • 我们先来看看网络层的作用:主要负责给来自传输层的数据打上自己的IP包头,而不用理睬数据是TCP、UDP、IGMP,ICMP还是其他的数据类型。如果将数据分片交给传输层,必然会先关注数据是采用TCP还是UDP,这无形间增加了实现的难度,所以交给网络层比较经济。要说明的是我们要尽量避免数据报的在网络层的分片,因为数据报分片后会提高路由器cpu的使用率,甚至造成网络拥堵的情况的发生。现在通常有两种方式来避免这种情况的发生:

    • 最大传输单元(MTU)
      我们知道一般网卡都有一个最大传输单元(MTU),以太网规定的MTU大小是1500字节。这就意味着超过1500字节的数据报将会被分片,但是只要小于1500字节的数据报就可以避免不被分片的命运了吗?答案是否定的。这里的数据报大小指的是传至数据链路层的数据报大小,所以真正称得上数据的部分其实只有1500 - TCP包头 - IP包头 = 1460字节。 如果不想被分片,那就得保证来自于应用层的数据大小不能大于1460字节。
    • 路径MTU的发现机制(PMTU)
      聊PMTU之前,我们得先解剖一下IP报头:
      在这里插入图片描述
      如果说现在又1460字节大小的数据报在网上传输,此时要经历一个MTU只有1000字节大小的路由器,普通的数据报肯定要经历分片,但是如果IP报头的标记位中的DF位为1,即不允许分片,那么此时路由器便会向请求主机发送一条ICMP消息,告诉主机请发一个1000字节的数据报。
<think>好的,我现在需要解决用户的问题:群辉系统重启后分配了外网IP而不是内网IP。这个问题听起来有点奇怪,因为通常内网IP是由路由器通过DHCP分配的,而外网IP是公网地址,由ISP分配,不会直接分配给内网设备。可能用户误解了情况,或者存在其他配置问题。 首先,我需要回忆一下群辉系统的网络配置。群辉NAS通常连接到内网,通过路由器获取内网IP(如192.168.x.x)。外网访问则需要端口转发或DDNS服务。用户提到的重启后分配到外网IP,这可能是指NAS获取了公网IP,但这在常规的局域网环境中是不可能的,除非NAS直接连接到了公网,而这种情况很少见,除非网络结构特殊,比如双网卡配置或者存在NAT配置错误。 可能的情况是用户的外网IP变化了,导致DDNS没有及时更新,或者端口转发失效。例如,用户可能配置了动态DNS来访问NAS,但路由器重启后外网IP改变,而DDNS服务未能及时更新,导致无法访问。但用户的问题描述是NAS本身获取了外网IP,这不太可能,除非NAS直接连接到调制解调器,而没有经过路由器,或者路由器处于桥接模式,导致NAS获得公网IP。这种情况下,可能涉及ISP分配IP的方式,或者路由器的配置问题。 接下来,我需要查阅用户提供的引用内容。引用1提到UPnP配置不稳定,建议关闭路由器的UPnP,手动配置端口转发。引用3提到使用快解析服务进行外网访问,需要添加映射,填写内网IP端口。这可能用户的端口转发配置有关,但NAS获取外网IP的关系不大。 可能用户混淆了外网访问的问题IP分配问题。例如,NAS重启后,路由器可能没有正确分配内网IP,导致NAS无法被内网访问,但外网IP其实是路由器的公网IP,不是NAS本身的。或者,用户可能在使用某些服务时,显示的是外网IP,而误以为是NAS的本地IP。 可能的解决方案包括检查NAS的网络设置,确保其使用DHCP获取内网IP,或者手动设置静态内网IP。另外,检查路由器的DHCP配置,确保分配给NAS的IP是内网地址。同时,关闭路由器的UPnP功能,手动配置端口转发,避免规则丢失。此外,使用DDNS服务来跟踪外网IP的变化,确保即使外网IP改变,也能通过域名访问。 另外,引用2提到的IP回流问题,即NAT回流,可能导致内网访问使用外网地址时出现问题。这可能与路由器的NAT配置有关,需要启用NAT回流功能,或者在内网访问时使用内网IP。 总结可能的步骤:1. 检查NAS的网络配置,设置静态内网IP。2. 在路由器中配置静态DHCP分配,确保NAS每次获取相同内网IP。3. 手动配置路由器端口转发,避免依赖UPnP。4. 使用DDNS服务,并确保其正确更新。5. 检查路由器的NAT设置,处理IP回流问题。 需要验证这些步骤是否符合用户的情况,并排除其他可能性,比如网络拓扑结构异常,或者NAS的多网口配置错误等。</think>针对群晖NAS重启后网络配置异常的问题,以下是分步解决方案: ### 问题根源分析 设备获取外网IP的情况在常规局域网中不可能发生。实际可能涉及以下两种情况: 1. **误读IP地址**:将路由器的公网IP误认为NAS的本地地址 2. **网络配置异常**:双网卡设备错误连接外网线路 3. **特殊网络拓扑**:存在直连公网的非标准部署 ### 标准解决方案 $$ \text{内网IP范围} = 192.168.0.0/16,\ 10.0.0.0/8,\ 172.16.0.0/12 $$ #### 步骤1:验证实际IP类型 登录群晖控制面板 → 网络网络界面 → 查看当前连接状态: - 合法内网IP示例:`192.168.1.100` - 公网IP特征:非上述三个私网地址段的数字组合 #### 步骤2:配置静态内网IP 1. 进入`控制面板 → 网络网络界面` 2. 选择活动连接 → 点击`编辑` 3. 选择`手动设置`模式 4. 输入规划的内网地址(如`192.168.1.200`) 5. 子网掩码设为`255.255.255.0` 6. 网关填写路由器地址(如`192.168.1.1`) #### 步骤3:路由器端配置 1. 登录路由器管理界面(通常为`192.168.1.1`) 2. 进入`DHCP服务器 → 静态地址分配` 3. 绑定NAS的MAC地址与设定的内网IP 4. 关闭`UPnP自动配置`功能[^1] 5. 手动创建端口转发规则: - 外部端口:5000(HTTPS) - 内部IP:NAS的静态地址 - 协议类型:TCP/UDP #### 步骤4:解决IP回流问题 在路由器高级设置中启用`NAT回流`(Hairpin NAT)功能,确保内网通过公网地址访问时能正确路由[^2] ### 高级配置方案 对于需要公网直连的特殊场景: 1. 在`控制面板 → 网络网络界面`创建新连接 2. 选择`PPPoE拨号`方式(需ISP支持) 3. 输入宽带账号密码 4. 启用故障转移链路聚合确保可靠性 ### 验证配置 ```python # 快速检测脚本示例 import socket def check_nas_connection(): nas_ip = "192.168.1.200" # 替换为实际内网IP try: socket.create_connection((nas_ip, 5000), timeout=2) return "内网连接正常" except: return "连接异常需排查" print(check_nas_connection()) ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值