关于TCP/UDP的输出

rel="File-List" href="file:///C:%5CDOCUME%7E1%5Cwoson%5CLOCALS%7E1%5CTemp%5Cmsohtmlclip1%5C01%5Cclip_filelist.xml"> rel="themeData" href="file:///C:%5CDOCUME%7E1%5Cwoson%5CLOCALS%7E1%5CTemp%5Cmsohtmlclip1%5C01%5Cclip_themedata.thmx"> rel="colorSchemeMapping" href="file:///C:%5CDOCUME%7E1%5Cwoson%5CLOCALS%7E1%5CTemp%5Cmsohtmlclip1%5C01%5Cclip_colorschememapping.xml"> rel="File-List" href="file:///C:%5CDOCUME%7E1%5Cwoson%5CLOCALS%7E1%5CTemp%5Cmsohtmlclip1%5C01%5Cclip_filelist.xml"> rel="themeData" href="file:///C:%5CDOCUME%7E1%5Cwoson%5CLOCALS%7E1%5CTemp%5Cmsohtmlclip1%5C01%5Cclip_themedata.thmx"> rel="colorSchemeMapping" href="file:///C:%5CDOCUME%7E1%5Cwoson%5CLOCALS%7E1%5CTemp%5Cmsohtmlclip1%5C01%5Cclip_colorschememapping.xml"> TCP输出:

每个 TCP 套接口有一个发送缓冲区,当应用程序调用 write 时,内核将应用程序的缓冲区的数据拷贝到 TCP 的发送缓冲区, ( 如果 write 成功返回,仅仅表示应用程序的缓冲区已经全部拷贝到 TCP 的发送缓冲区,说明此时应用程序的缓冲区中的数据可以丢弃,并不表示 TCP 的数据已经成功发送 )TCP 以对方 MSS(maximum segment size) 大小或者更小发送数据块给 IP ,并给每个数据块加上 TCP 头部形成分节, IP 给每个分节安上 IP 头部形成数据包(分组)(一般都会小于 MTU ,所以不用再分片),并寻找目标 IP 地址,及路由表项以确定外出接口,然后把数据包传给数据链路,加入链路输出队列,如果队列满,分组丢弃,并通过协议栈向上返回错误:链路层到 IP 层, IP 层到 TCP 层, TCP 记住这个错误并在某个时候重传这个分节。当对方(设为服务器)接受到数据时,会发送 ACK ,本机(客户端)接受 ACK ,并应答 ACK ,此时,发送缓冲区的数据废弃,此缓冲区可以再次写入其他数据。

rel="File-List" href="file:///C:%5CDOCUME%7E1%5Cwoson%5CLOCALS%7E1%5CTemp%5Cmsohtmlclip1%5C01%5Cclip_filelist.xml"> rel="themeData" href="file:///C:%5CDOCUME%7E1%5Cwoson%5CLOCALS%7E1%5CTemp%5Cmsohtmlclip1%5C01%5Cclip_themedata.thmx"> rel="colorSchemeMapping" href="file:///C:%5CDOCUME%7E1%5Cwoson%5CLOCALS%7E1%5CTemp%5Cmsohtmlclip1%5C01%5Cclip_colorschememapping.xml"> UDP输出:

rel="File-List" href="file:///C:%5CDOCUME%7E1%5Cwoson%5CLOCALS%7E1%5CTemp%5Cmsohtmlclip1%5C01%5Cclip_filelist.xml"> rel="themeData" href="file:///C:%5CDOCUME%7E1%5Cwoson%5CLOCALS%7E1%5CTemp%5Cmsohtmlclip1%5C01%5Cclip_themedata.thmx"> rel="colorSchemeMapping" href="file:///C:%5CDOCUME%7E1%5Cwoson%5CLOCALS%7E1%5CTemp%5Cmsohtmlclip1%5C01%5Cclip_colorschememapping.xml"> UDP 因为是不可靠的,它不必保存应用进程的数据拷贝,所以没有发送缓冲区, UDP 给每个数据块安上 8 个字节的 UDP 头部,形成数据报并传给 IP IP 给数据报安上 IP 头部形成数据包(分组),如果数据包不合适 MTU ,则执行分片,然后把每个分片加入到数据链路层的输出队列。应用程序的 write 返回表示数据已经加入到输出队列。同时注意 UDP 没有 MSS ,所以关于数据包的分片就更多的发生在 UDP 而不是 TCP

附:

rel="File-List" href="file:///C:%5CDOCUME%7E1%5Cwoson%5CLOCALS%7E1%5CTemp%5Cmsohtmlclip1%5C01%5Cclip_filelist.xml"> rel="Edit-Time-Data" href="file:///C:%5CDOCUME%7E1%5Cwoson%5CLOCALS%7E1%5CTemp%5Cmsohtmlclip1%5C01%5Cclip_editdata.mso"> rel="themeData" href="file:///C:%5CDOCUME%7E1%5Cwoson%5CLOCALS%7E1%5CTemp%5Cmsohtmlclip1%5C01%5Cclip_themedata.thmx"> rel="colorSchemeMapping" href="file:///C:%5CDOCUME%7E1%5Cwoson%5CLOCALS%7E1%5CTemp%5Cmsohtmlclip1%5C01%5Cclip_colorschememapping.xml">

2006-09-07 08:16:40

 

 

 

 

 

1、什么情况下需要改MTU

  如果您的动态域名网站不能被正常访问,很难连接,连接上也非常慢,请试试把DirectSend设为总是关闭。如果关闭后可以正常访问,这种情况就需要修改MTU。如果您的网站连接正常,只是下载速度慢,就不必改MTU了。请跳过这一节。

2、什么是MTU

  MTUMaximum Transmission Unit的缩写。意思是网络上传送的最大数据包。MTU的单位是字节。

  大部分网络设备的MTU都是1500。如果本机的MTU比网关的MTU大,大的数据包就会被拆开来传送,这样会产生很多数据包碎片,增加丢包率,降低网络速度。把本机的MTU设成比网关的MTU小或相同,就可以减少丢包。

3、如何检测网关的MTU

  在本机打开dos窗口,执行:

    ping -f -l 1472 192.168.0.1

    其中192.168.0.1是网关IP地址,1472是数据包的长度。请注意,上面的参数是“-l”(小写的L),而不是“-1”

  如果能ping通,表示数据包不需要拆包,可以通过网关发送出去。

  如果出现:
    Packet needs to be fragmented but DF set.

  表示数据包需要拆开来发送。此时,减少数据包长度,再执行上面的ping命令。从14001472之间多试几次,就能找到合适的数据包长度了。把数据包长度加上数据包头28字节,就得到MTU的值。

  如果检测到网关的MTU值是1500,不需要修改。

  如果网关有防火墙ping不通,可以试试直接把MTU设为1400

4、如何修改本机的MTU

 修改方法之一:

1)、运行regedit

2)、浏览到:

HKEY_LOCAL_MACHINE//SYSTEM//CurrentControlSet//Services//Tcpip//Parameters//Interfaces

3)、Interfaces下有多个子项,每个子项对应一个网卡。请按如下方法选择网卡:

  (a)确定本机用来连接Internet的网卡或拨号连接的IP,如192.168.0.19

  (b)用鼠标点击Interfaces上的子项,查看键值列表中的IPAddress项;

  (c)如果IPAddress的键值与(a)中的IP相同,即192.168.0.19,则该子项就是要找的网卡。

4)、进入该子项,在右边的窗口里按鼠标右键,选择新建”->“双字节值,输入名称“MTU”,按回车。再用鼠标双击“MTU”,弹出修改窗口:

  填入MTU的值。填写前请先把基数设为十进制。

  设置好后,需要重启机器才能生效。

 

修改本机MTU值方法之二
  修改本机默认的MTU值可以通过注册表来进行,但更直观稳妥的方法是使用一些系统优化软件,如超级兔子“Windows优化大师等,本例使用超级兔子 V6.25”进行演示。如图7是进入魔法设置网络设置标签的画面,首先选中使用最大传输单元前面的勾,然后再从后面的数据栏中输入计算出的MTU值(1466)后点击确定并重启电脑即可。


MTU: Maxitum Transmission Unit 最大传输单元

  MSS: Maxitum Segment Size 最大分段大小(偶是直译,翻译的不好,不要打俺PP)

  PPPoE: PPP Over Ethernet(在以太网上承载PPP协议)

  [分析过程]

  先说说这MTU最大传输单元,这个最大传输单元实际上和链路层协议有着密切的关系,让我们先仔细回忆一下EthernetII帧的结构DMAC+SMAC+Type+Data+CRC

  由于以太网传输电气方面的限制,每个以太网帧都有最小的大小64bytes最大不能超过1518bytes,对于小于或者大于这个限制的以太网帧我们都可以视之为错误的数据帧,一般的以太网转发设备会丢弃这些数据帧。

  (:小于64Bytes的数据帧一般是由于以太网冲突产生的碎片或者线路干扰或者坏的以太网接口产生的,对于大于1518Bytes的数据帧我们一般把它叫做Giant帧,这种一般是由于线路干扰或者坏的以太网口产生)

  由于以太网EthernetII最大的数据帧是1518Bytes这样,刨去以太网帧的帧头(DMAC目的MAC地址48bit=6Bytes+SMACMAC地址48bit=6Bytes+Type2bytes)14Bytes和帧尾CRC校验部分4Bytes(这个部门有时候大家也把它叫做FCS),那么剩下承载上层协议的地方也就是Data域最大就只能有1500Bytes这个值我们就把它称之为MTU。这个就是网络层协议非常关心的地方,因为网络层协议比如IP协议会根据这个值来决定是否把上层传下来的数据进行分片。就好比一个盒子没法装下一大块面包,我们需要把面包切成片,装在多个盒子里面一样的道理。

  当两台远程PC互联的时候,它们的数据需要穿过很多的路由器和各种各样的网络媒介才能到达对端,网络中不同媒介的MTU各不相同,就好比一长段的水管,由不同粗细的水管组成(MTU不同 )通过这段水管最大水量就要由中间最细的水管决定。

  对于网络层的上层协议而言(我们以TCP/IP协议族为例)它们对水管粗细不在意它们认为这个是网络层的事情。网络层IP协议会检查每个从上层协议下来的数据包的大小,并根据本机MTU的大小决定是否作分片处理。分片最大的坏处就是

  降低了传输性能,本来一次可以搞定的事情,分成多次搞定,所以在网络层更高一层(就是传输层)的实现中往往会对此加以注意!有些高层因为某些原因就会要求我这个面包不能切片,我要完整地面包,所以会在IP数据包包头里面加上一

  个标签:DF(Donot Fragment)。这样当这个IP数据包在一大段网络(水管里面)传输的时候,如果遇到MTU小于IP数据包的情况,转发设备就会根据要求丢弃这个数据包。然后返回一个错误信息给发送者。这样往往会造成某些通讯上的问题,不过幸运的是大部分网络链路都是MTU1500或者大于1500

  对于UDP协议而言,这个协议本身是无连接的协议,对数据包的到达顺序以及是否正确到达不甚关心,所以一般UDP应用对分片没有特殊要求。

  对于TCP协议而言就不一样了,这个协议是面向连接的协议,对于TCP协议而言它非常在意数据包的到达顺序以及是否传输中有错误发生。所以有些TCP应用对分片有要求---不能分片(DF)

  花开两朵,各表一枝,说完MTU的故事我们该讲讲今天的第二个猪脚---PPPoE所谓PPPoE就是在以太网上面跑PPP协议,有人奇怪了,PPP协议和Ethernet不都是链路层协议吗?怎么一个链路层跑到另外一个链路层上面去了,难道升级成网络层协议了不成。其实这是个误区:就是某层协议只能承载更上一层协议。

  为什么会产生这种奇怪的需求呢?这是因为随着宽带接入(这种宽带接入一般为Cable Modem或者xDSL或者以太网的接入)由于以太网缺乏认证计费机制而传统运营商是通过PPP协议来对拨号等接入服务进行认证计费的,所以就出了这么一个怪胎:PPPoE(有关PPPoE的详细介绍参见V大以及本站其他成员的一些介绍文章,我就不啰里啰唆的了)

  PPPoE带来了好处,也带来了一些坏处,比如:二次封装耗费资源,降低了传输效能等等,这些坏处俺也不多说了,最大的坏处就是PPPoE导致MTU变小了以太网的MTU1500,再减去PPP的包头包尾的开销(8Bytes),就变成1492

  如果两台主机之间的某段网络使用了PPPoE那么就会导致某些不能分片的应用无法通讯。

  这个时候就需要我们调整一下主机的MTU,通过降低主机的MTU,这样我们就能够顺利地进行通讯了。

  当然对于TCP应用而言还有另外的解决方案。

  马上请出今天第三位猪脚:MSS

  MSS最大传输大小的缩写,是TCP协议里面的一个概念。

  MSS就是TCP数据包每次能够传输的最大数据分段。为了达到最佳的传输效能TCP协议在建立连接的时候通常要协商双方的MSS值,这个值TCP协议在实现的时候往往用MTU值代替(需要减去IP数据包包头的大小20BytesTCP数据段的包头20Bytes)所以往往MSS1460。通讯双方会根据双方提供的MSS值得最小值确定为这次连接的最大MSS值。

  介绍完这三位猪脚s

  我们回过头来看前言里面的那个问题,我们试想一下,如果我们在中间路由器上把每次TCP连接的最大MSS进行调整这样使得通过PPPoE链路的最大MSS值加上数据包头包尾不会超过PPPoEMTU大小1492这样就不会造成无法通讯的问题.所以上面的问题可以通过ip tcp adjust-mss 1452来解决。

  当然问题也可以通过修改PC机的MTU来解决。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值