Chinaunix首页 | 论坛 | 博客
  • 博客访问: 132510
  • 博文数量: 24
  • 博客积分: 2010
  • 博客等级: 大尉
  • 技术积分: 280
  • 用 户 组: 普通用户
  • 注册时间: 2006-11-14 15:19
文章分类

全部博文(24)

文章存档

2014年(6)

2008年(3)

2007年(15)

我的朋友

分类: 网络与安全

2007-07-12 15:55:59

最近决定对照2。6的代码重新阅读TCP协议,以便使自己对TCP的理解能更深入一点。

TCP 传输控制协议概述

       TCP是一种基于IP协议的,提供面向连接的,可靠的,全双工的字节流服务的传输层协议。

       TCP面向连接的概念可以理解为与2层相似的一种虚电路的概念,即在开始使用TCP传输数据之前,必须先建立一个连接(虚电路),在连接建立好之后,双方,也只能是连接的两端两个“端”才能开始进行数据交换。因此,广播和多播是不能应用于TCP的。

      

TCP的主要特点

       TCP自己组织需要发送的数据块的大小。这一点可能让很多开发者感觉不爽,也是造成很多bug的原因。当应用开发人员使用write或者send发送数据后,其实是将数据拷贝到了kernelTCP的发送缓存中,这之后的事情就完全由TCP来决定了,TCP会把数据划分成它认为最合适的数据块。这个思想是和UDP完全不同的。

       TCP发送一块数据后,它会启动一个定时器timer,等待接收方的确认,如果在timer规定的时间内接收不到确认数据,则重新发送刚才的数据块。

       TCP收到来自另外一端的数据后,它会发送一个针对接受到的数据的确认,通常这个确认会推迟一段时间(非常短的时间)发送出去。

       TCP会始终保持一个整个TCP报文段(包括headerdata)的校验和,用于检测在数据传输中是否出现错误。如果有则丢弃当前收到的这个数据段。

       TCP必须对到达的数据进行排序。

       TCP必须能够丢掉重复的数据段。

       TCP的另外一个非常重要的功能是它可用提供流量控制。它的两端都有一定的固定大小的buffer空间。接手段必须告诉发送端自己所能接收的最大数据,而发送端发送的数据不能超过接收端buffer的大小。

       TCP不对它所传送的字节流做任何解释,它不知道所传送的字节流是二进制还是ASCII字符,这个问题是应用层应该考虑的问题。

TCPHeader主要内容

       首先16位的src port16位的dst port用来区分应用程序。

       TCP Header中两个32位是一个序号与一个确认序号,这两个东西比较难理解。首先序号用来标识从发送端向接收端发送的数据字节流,它表示这个数据段中的第一个数据字节。其实序号就是一个发送端发送数据的计数器,发送端发送的第二个TCP包的序号减去第一个TCP包的序号就可以得出第一个TCP包发送的数据块的大小。序号是一个32位的无符号证书,达到232次方减1后又从0开始。

       需要注意的是,当建立一个TCP连接时,SYN标志变为1,此时序号字段包含了发送方主机选择的出示序号ISN,但是一般情况下这个ISN0,改发送方要发送的数据的第一个字节序号为这个ISN1,因此在建立TCP连接的第一个TCP包中,序号为0,因为ISN0,而建立TCP连接又没有要发送的数据,所以序号为0

       确认序号标识接收方(即发送确认的一方)所期望接收到的下一个序号,也就是它接收到的TCP包的序号加1,并且只有ACK位为1时此确认序号才生效。但是通常情况下这种情况总是正确的,因为一个TCP连接一旦建立,之后的报文中ACK位总会被设置。

       需要注意的是,序号和确认序号是有方向的,因为TCP提供的是全双工的服务,所以在每一个方向上的序号和确认序号都是不同的。

       确认序号其实就是表示已经收到了发送端发送的一些数据,但是当前确认序号所标识的数据还没有收到,这个确认序号可以被发送方用来判断是否需要重发。

       4位的Header长度标识当前TCP包的header长度,最长是60个字节,而正常的TCPheader长度是20字节。

       6位的标志位。URG:紧急指针有效;ACK:确认序号有效;PSH:接收方应该立刻将此包发给应用层;RST:复位一个连接;SYN:发起一个TCP连接;FIN:结束一个连接。

       16位的窗口大小。TCP的流量控制由连接每一端通过声明窗口大小来提供。窗口大小为字节数,从确认序号的值开始。比如一端声明窗口大小为4096,当前的确认序号为10000,则表明这一端当前能接收的最大字节数为4096,而它希望接收从序号10000开始的数据。

       16位的校验和。这个校验和覆盖整个TCP报文。它一定是由发送端来计算和填充的。而且必须由接收端进行验证。

       16位的紧急数据指针,只有当URG标志位为1时才有效。它是一个偏移量,标识从序号开始的直到指针所指的数据,这一段数据被发送端设置为紧急数据。

       TCP Header中还有一些options字段,最常用的是MSS字段,通常是SYN报文中携带这个字段,表明本端所能接收的最大长度的报文段。

       另外需要表明的是,TCP可用不携带任何数据,二期这种报文还很有用,可用用来确认数据,也可以用来处理超时。

阅读(1695) | 评论(0) | 转发(0) |
0

上一篇:dup2 纪念

下一篇:要注意身体健康

给主人留下些什么吧!~~