tcpip协议 之三

1.IP(IPV4)为什么要分片?如何控制分片?分片在何处?为什么?分片在何处重组?分片的数据包时越大越好还是越小越好?为什么?
分片原因:物理网络都存在最大的传输单元限制,也就是MTU限制,IP报文较大时,无法将一个IP数据包封装在一个物理帧中。因此需要将IP数据拆分成多个报文,多次发送出去。以太网的MTU一般为1500个字节(去掉物理网络的帧头帧尾,实际传输数据无法达到1500)。IP数据最大可达64k(IP协议中长度字段为16位,因此最大报文可达2^16=64k)
IP分片控制:IP首部中有三个字段参与分片控制。三个字段分别是标识(Identificatoin,16bits),标志(Flags,3bits) 与 片偏移量(Fragment offset,13bits,以字节为单位)。Identificatoin唯一的标识了数据报,Identificatoin在发送方全局唯一。通过这三个字段可以将属于同一报文的不同分片重组成一个完成的报文,详细不解释了。
IP分片一般在路由器处进行:当经过一个大MTU的物理网络到达一个小MTU的物理网络的时候,路由器会将数据报拆分使其能够通过小MTU的物理网络传输。没有在发送端分片的原因是因为发送源无法知道路径上最小的MTU到底是多大。
IP在目的站主机进行重组:因为它允许每个分片能够独立选择路由,不需要中间路由器存储和重组分片。但它也有缺点:丢失一个数据片意味着丢失整个数据报;小的数据报文通过较大MTU的物理网络时效率较低。
IP分片越大越好:分片越大,则分片数量越少,那么选路负担会减轻;分片数量少,那么出错的几率也低;另外,分片数量越少,额外的报文首部数据越少,信道利用率更高。


IPV6对分片有一定改变。IP分片不再在中间路由器进行。分片是端对端的,在发送源分片,目的站重组。负责分段的源站可以选择1280字节的最小MTU,也可以执行路径MTU发现(Path MTU Discovery)技术,获取从源站到目的站最小的MTU。采用端到端分片的目的是为减少路由器的负担,这样路由器能够处理能够的报文。端到端分片也造成一个后果,就是数据报文长度超过物理网络的MTU后会被丢弃(因为路由可能会被改变),然后向源站返回一个ICMP报文。


2.tcp拥塞控制
congeston collapse:当网络发生拥塞后,数据报填满路由器缓存,路由器满负荷路由,对机器则表现为网络时延加大,网络时延加大后,那么造成数据报超时的几率增大,数据报超时后,主机通常的反应就是重传,报文重传不会减轻拥塞,只会加重拥塞。

发送源对拥塞响应:TCP标准推荐处理技术:慢启动,加速递减
加速递减策略:一旦发生拥塞(路由器丢弃报文时会发送ICMP源站抑制报文),那么立即将拥塞窗口减半  (拥塞窗口将影响滑动窗口协议的窗口大小);对于保留在发送窗口中的报文段,将重传定时器的时限加倍(这样能够容忍更大的网络时延,使得因报文超时而重传的可能性降低)
慢启动恢复:在启动新连接的传输或者拥塞之后增加通讯量时,仅仅以一个报文段作为拥塞窗口的初始值,而每当收到一个确认后,将拥塞窗口增加1。
慢启动是为了防止通讯量在0和拥塞间剧烈震荡。想象一下,如果窗口直接全部恢复,那么将会瞬时发送大量报文,将很可能马上导致拥塞,拥塞后通讯量马上又会暴减;通讯量减少后马上又恢复,马上又将导致拥塞。

拥塞避免:当拥塞窗口到达拥塞时窗口大小的一半时,TCP将进入拥塞避免状态,降低窗口增大的速度。此时窗口中所有的报文段都被确认之后,窗口大小也只能增加1。
拥塞避免是为了避免窗口增加过快以至于导致更多的拥塞。

路由器对拥塞响应:丢弃报文
丢弃策略有尾部丢弃与随机早期丢弃RED。尾部丢弃是当路由器缓存满了以后,后面来的报文直接全部丢弃。

随机早期丢弃则是在路由器缓存快要满时随机性的丢弃报文,使部分发送主机提前进行拥塞控制状态,从而避免全局同步。
RED的详细策略:数据报到达时,若缓存已满,则丢弃报文,若缓存未满,但大小已经超过了上限阈值,则按概率p丢弃该报文。

 

三层交换:二层交换技术+三层转发技术


UDP checksum
UDP optional
TCP mandatory
UDP checksum covers the UDP pseudo header, UDP header and the UDP data
与ip不同, ip只计算首部校验和
purpose: let UDP double-check that the data has arrived at the correct destination.
检测到checksum error: silently discarded, no error message is generated.
只有发送端和接收端才计算校验和,中间节点不计算
伪首部包括源ip,目的ip,协议,udp长度以及0填充

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
TCP/IP协议是一种用于在网络中传输数据的协议。在C#中,我们可以使用TcpClient类和TcpListener类来实现TCP/IP协议的通信。 TcpClient是一个用于创建TCP客户端的类,它可以连接到远程服务器并发送和接收数据。我们可以通过实例化TcpClient类,并使用Connect方法连接到指定的服务器。然后,我们可以使用TcpClient实例的相关方法和属性来发送和接收数据TcpListener是一个用于创建TCP服务器的类,它可以监听指定的端口,并等待来自客户端的连接。我们可以通过实例化TcpListener类,并使用Start方法开始监听指定端口。然后,我们可以使用AcceptTcpClient方法来接受客户端的连接,并使用相关方法和属性与客户端进行数据交互。 在C#中,我们可以使用Socket类来进行低级别的套接字编程,也可以使用TcpClient和TcpListener类对套接字进行封装,方便我们进行TCP/IP通信。 总结起来,C#中的TCP/IP协议可以通过TcpClient类和TcpListener类来实现客户端和服务器端的通信。TcpClient类用于创建TCP客户端,并与远程服务器进行数据交互,而TcpListener类用于创建TCP服务器,并监听指定的端口等待客户端的连接。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *3* [基于C#的TCP/IP协议应用(一)](https://blog.csdn.net/baidu_35536188/article/details/114291257)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* [C# TCPIP通讯协议源码](https://blog.csdn.net/u011104291/article/details/127422452)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值