有时候,当我孤独地坐着等待生命大门关闭时,一种与世隔绝的感觉就会像冷雾一样笼罩着我。远处有光明、音乐和友谊,但我进不去,命运之神无情地挡住了大门。我真想义正词严地提出抗议,因为我的心仍然充满了热情。但是那些酸楚而无益的话语流溢在唇边,欲言又止,犹如泪水往肚里流,沉默浸透了我的灵魂。然后,希望之神微笑着走来对我轻轻耳语说:“忘我就是快乐。”因而我要把别人眼睛所看见的光明当作我的太阳,别人耳朵所听见的音乐当作我的乐曲,别人嘴角的微笑当作我的快乐。

tcp协议复习-option字段

上一篇 / 下一篇  2009-08-21 17:07:25 / 个人分类:基础学习

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主要内容

TCP报头总长最小为20个字节,其报头结构如下图(图1)所示;

                                                                                                     比特0             比特15   比特16             比特31

源端口(16

目的端口(16

序列号(32

确认号(32

TCP偏移量(4

保留(6

标志(6

窗口(16

校验和(16

紧急(16

选项(032

数据(可变)

(图1 TCP报头结构)

       首先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可以不携带任何数据,而且这种报文还很有用,可用用来确认数据,也可以用来处理超时。




TAG:

 

评分:0

我来说两句

Open Toolbar