Chinaunix首页 | 论坛 | 博客
  • 博客访问: 466994
  • 博文数量: 62
  • 博客积分: 1742
  • 博客等级: 中尉
  • 技术积分: 859
  • 用 户 组: 普通用户
  • 注册时间: 2010-11-06 00:13
个人简介

这是一句很长很长而且又很啰嗦并且很无聊的废话...

文章分类

全部博文(62)

文章存档

2013年(1)

2012年(13)

2011年(48)

分类: LINUX

2011-12-25 15:28:33

 TCP/IP 4层网络

 TCP的3次握手

 TCP的4次挥手

TCP的SEQ和ACK
  在TCP通讯中,无论是建立连接,数据传输,友好断开,强制断开,都离不开Seq值和Ack值,它们是TCP传输的可靠保证.Seq是发送方告诉接收方,我当前已经发送了Seq个字节(不包括Eth头,IP头和Tcp头,也就是纯数据长度)给你,例如在建立连接双方握手时,发送方的Seq为0,发送的数据长度也为0,这时接收方收到数据帧后,会判断Seq+数据长度为0或者Seq+数据长度为1的话,那么在回应发送方的Ack的值就为1(也就表示确认号有效,为0的话就表示数据包中不包含确认信息,忽略确认号字段).在数据传输中,如果Seq+数据长度不为0或1并且数据长度不为0的话,则Ack就等于Seq+数据长度的值,这就表示我已经收到Seq+数据长度个字节的数据.发送方收到该Ack就会比较自己的Seq+刚发出去的纯数据长度,如果一致,则回应接收方的Ack,并且发送下一个包,否则将重发该包,若超时还没收到Ack也会重发该包.

TCP的MSS值
  TCP的MSS值是双方在建立连接时(3次握手)根据自身传输状况(例如网卡支持单帧大小,缓存大小等)所协商出来的单帧完整报文最大长度,一般在主机回应时就确定下来了,取两方的最小值一方,该值是放在TCP头的Option选项中.而UDP传输的MSS值是在应用层协商的,如TFTP协议.一般情况下MSS值是不能超过1518字节的,也就是网络传输中单个数据包不能大于1.48KB.

TCP的滑动窗口
  Tcp滑动窗口值表示在指定的时间内,发送方可以发送窗口值大小的数据后才需要收到一个接收方的Ack包(但并不总是填满整个窗口值).因为如果每发送一个数据包就需要得到一个回应,在网络状况佳的情况下,这会浪费很多资源,所以,该值会通过接收方的Ack包动态调节,在网络空闲的状态下会加大窗口值,在网络忙的情况下会缩小,以确保数据能实时可靠地传输.该值一般是MSS值的倍数.因此滑动窗口是接收方的流量控制.
  1.窗口的左边沿向右边沿靠近为窗口合拢,这种现象发生在数据被发送的确认时.
  2.当窗口右边沿向右边移动时.将允许发送更多的数据,称为窗口张开,发生在另一端的接收进程读取已经确认的数据并释放了TCP的接收缓存时.
  3.当右边沿向左移动时,称为窗口,不建议使用这种方式.

TCP的拥塞窗口
  Tcp的拥塞窗口是发送方对流量的控制.发送方在初始化连接时拥塞窗口值为MSS值(以字节为单位),当收到接收方的Ack后,该值就会以指数增加一次,发送方会取滑动窗口和拥塞窗口的最小值作为发送上限.顺便说一下,滑动窗口和拥塞窗口是指TCP头的Window字段.滑动是指接收方发出的,拥塞是发送方发出的.
阅读(4554) | 评论(11) | 转发(5) |
给主人留下些什么吧!~~

GFree_Wind2011-12-26 22:39:18

czysocket_dara: MSS也是MTU减IP头和TCP头.那你说MTU是怎么来的?并且如果接收方的路由负载MTU小于发送方MTU(路由或本机),难道也依然按发送方的MTU大小双向通讯吗?
求指点.

UDP确.....
呵呵,我说的可能太学究了。PMTU肯定是由这条链路本身决定的。
所以PMTU不是本机MTU决定的。

UDP来说,你可以最大发送65535大小的UDP数据包。但是到了IP层,它会根据MTU进行IP分片。

所以,如果你只是应用层的开发,其实不需要关心你一次发送的数据包大小。这才是TCP/IP分层的意义所在。

czysocket_dara2011-12-26 21:02:58

GFree_Wind: 对于UDP来说,没有MSS的概念。

MSS不是协商出来的,完全由发送方根据PMTU而决定的。.....
MSS也是MTU减IP头和TCP头.那你说MTU是怎么来的?并且如果接收方的路由负载MTU小于发送方MTU(路由或本机),难道也依然按发送方的MTU大小双向通讯吗?
求指点.

UDP确实是没有这个概念,也没有这个字段,但是传输单帧包大小还是有个合理值吧,不可能说用了UDP,我单帧大小就随便设置...

GFree_Wind2011-12-26 18:43:21

czysocket_dara: 在做裸板TFTP交互的时候,跟服务器对接协议时,会有个block_size,也就是单包大小.加上UDP头里又没有一个最大帧大小,所以我认为UDP的MSS值的概念应该是在应用层定下.....
对于UDP来说,没有MSS的概念。

MSS不是协商出来的,完全由发送方根据PMTU而决定的。

czysocket_dara2011-12-26 14:53:08

GFree_Wind: TCP的MSS是根据PMTU决定的。

另外UDP怎么也有MSS呢?.....
在做裸板TFTP交互的时候,跟服务器对接协议时,会有个block_size,也就是单包大小.加上UDP头里又没有一个最大帧大小,所以我认为UDP的MSS值的概念应该是在应用层定下来的,至于其他基于UDP的协议的应用层协议还真没深入仔细研究过.

TCP的MSS是根据PMTU,但是MTU值也就是根据双方的网络状况和硬件实际情况所协商出来的吧!

GFree_Wind2011-12-26 12:24:52

TCP的MSS是根据PMTU决定的。

另外UDP怎么也有MSS呢?