Chinaunix首页 | 论坛 | 博客
  • 博客访问: 466975
  • 博文数量: 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字段.滑动是指接收方发出的,拥塞是发送方发出的.
阅读(4553) | 评论(11) | 转发(5) |
给主人留下些什么吧!~~

GFree_Wind2011-12-27 21:41:07

czysocket_dara: 呵呵,首先多谢指教了.我想有空还是实际在裸板上写个TCP客户端跟PC上服务器通讯,另外用大白鲨观察一下服务器端的包.都把提到的问题验证下.

window是控制速度的,.....
关于window那块,基本正确。如果接收方只有512,发送方非发来1024。那么ok,接收方我只ack 512,剩下的你重发。不过还要等到接收方的window有地方才行。

一般情况下,不会出现上面说的那个情况。因为发送方会根据接收方的window size来决定发送多少。不然发多了,也没有用。

czysocket_dara2011-12-27 21:29:14

GFree_Wind: MSS如何确定,你可以去看RFC或者Linux kernel的源码。

而window size本来就是用于告诉对方,我只能接收512字节。就是用于控制对方的发送速度。

关于PMTU,看这.....
呵呵,首先多谢指教了.我想有空还是实际在裸板上写个TCP客户端跟PC上服务器通讯,另外用大白鲨观察一下服务器端的包.都把提到的问题验证下.

window是控制速度的,但只是告诉对方在指定时间内你能发多少,而不是专门用来限制单帧大小.你下面说的512,是我只能收512了,所以这个包你只能发512,是这个意思吧!那如果说,在一定网络状况下,我只能收3000,那他还是以MSS大小单帧发送,只是发完了,就不发,直到对方的Ack来.

另外,我也会好好看下这个链接上说的.

czysocket_dara2011-12-27 15:48:25

GFree_Wind: 第一个问题:MSS值是一个发送方的值,如果对方发送来的MSS为1460,那么对端就会一直使用该值。你回包的MSS设为800,只是表面你发送的时候,Maximum Segment Siz.....
第一个问题,我想知道你是怎么验证MSS是按你所说的这样协商的?另外,Window值以接收方对发送方来说,不是告诉他在指定时间内,我这里有这么大的缓冲区,你可以发满了,我再发个Ack给你.怎么变成了控制单帧最大值了?

第二个问题,你说的硬件是指发送方机器还是指发送方经过的路由网关硬件,还是两者?

GFree_Wind2011-12-27 10:19:13

czysocket_dara: TCP的MSS值也有可能是我说的太朦胧了,谢谢指正.
呵呵,打个比方,例如我是接收方,发送方的请求SYN到我这里的MSS值为1460(已经经过多个路由了),然而,我本机或板子(.....
第一个问题:MSS值是一个发送方的值,如果对方发送来的MSS为1460,那么对端就会一直使用该值。你回包的MSS设为800,只是表面你发送的时候,Maximum Segment Size是800。注意,是你的。这两个值可以不同。它们只会在PMTU变化时,才更新。如果你作为接收方希望对端不要发送1460大小的数据包。ok,你应该使用window来告诉对方你的缓冲区是800,发送1460是不可能被接收的。


第二个问题。MTU是2层链路层决定的,根据硬件和链路情况设置的。

czysocket_dara2011-12-27 09:50:48

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

UDP来说,你可以最大发送65535大小的UDP数据包。但是到了IP层,它.....
TCP的MSS值也有可能是我说的太朦胧了,谢谢指正.
呵呵,打个比方,例如我是接收方,发送方的请求SYN到我这里的MSS值为1460(已经经过多个路由了),然而,我本机或板子(实时系统或裸板)的TCP栈或缓冲区只给他800,我在回应包Ack时把MSS值设为800,那你说,这次双向通讯中是不是还是以1460为单包大小?

我知道IP会自动分片,UDP和IP头都没有MSS或MTU字段,那你说IP分片它的MTU又是由什么决定的呢?