传输控制协议TCP(一,概述,首部)

来源:互联网 发布:实对称矩阵是正交矩阵 编辑:程序博客网 时间:2024/05/19 21:00

TCP概述

TCP是TCP/IP体系中面向连接的运输层协议,它提供全双工的和可靠交付的服务.TCP与UDP最大的区别就是TCP是面向连接的,而UDP是无连接的(面向报文)。

在使用TCP协议传输时,发送方的应用程序将要发送的数据块写入发送缓存里,然后TCP再从发送缓存里取出一定量的数据,将其组成TCP报文段逐个传送给IP层,然后发送去。接收方从IP层中接受到报文段后,将其暂时放在接受缓存中,然后让接收方的应用程序从接受缓存中将数据块逐个读取。(需要注意的是,因为TCP是面向连接的,所以发送方和接收方都存在这两个缓存,都可以发送和接受对方的报文段)

因为TCP是面向连接的,所以TCP每一条连接上的通信只能是一对一的,而不能是一对多、多对一或多对多。

而TCP在为了确保传输的可靠性,在A发送了报文段2后,B需要确认收到报文段2。如果报文段2在发送过程中,发生了错误,则B主机会将报文段丢掉,不会向A确认收到报文段2,A在等候一段时间,超过了超时计时器的时间后,就会重新传送这个未发成功的报文段2,这叫超时重传。但发送后,报文段2又丢失了,在等待一段时间过后,超时计时器所设置的时间又到了,而A仍然没有收到B的确认,此时A会在此对报文段2超时重传,如果这次一切顺利的话,B收到之后会进行确认。之后A又发送报文段3.


在这里需要注意两个问题。第一个是A在发送完报文段2之后,必须留有该报文段的副本,以便在必要的时候进行重传。另一个问题是超时重传时间的设定,如果设定的时间太短了,那么A还没等到B的确认,就已经超时重传了,会浪费网络资源,在网络上增加不必要的通信量。但如果设置的时间过长,则会严重的影响通信效率。这个重传的时间的设定是相当复杂的,需要谨慎决定。

下图说明了另一种情况。B发送的对报文段2的确认丢失了。A无法知道自己发送的报文段2是否出错或者丢失。因此报文段2会超时重传。现在应注意B的动作,B再次收到报文段2的时候会丢弃重复的报文段,并且再次发送确认。这个重复的确认不能省略,因为A再次发送了报文段2就表示没有收到来自B的确认。


通过以上所说的确认和重传机制,我们就可以在IP层的通信是不可靠的情况下,使运输层之间的通信成为可靠的。

另外,还有几个地方需要注意:

第一、TCP的报文段长度是不确定的,以报文段作为确认的单位不够方便。现在TCP是用字节序号进行确认的。

第二、TCP能够提供全双工通信,即双方可同时发送数据。因此,不必专门发送确认报文段,而可以在自己发送自己的数据报文段的同时,少带的把确认信息发送过去。

第三、TCP可以连续发送多个报文段。

TCP报文段的首部TC

一个TCP报文段分为首部和数据部两个部分。TCP的全部功能都体现在它首部中各字段的作用。因此,只有弄清TCP首部各字段的作用才能掌握TCP的工作原理。

TCP报文段首部的前20个字节是固定的,后面有4N字节是根据需要而增加的选项(N必须是整数)。因此TCP首部的最小长度是20字节。


首部固定部分各字段的意义如下:

(1)源端口和目的端口:

各占2个字节。端口是运输层和应用层的服务接口。运输层的复用和分用功能都要通过端口才能实现。

(2)序号:

占4个字节。序号从0开始,到2的32次方-1位置。共2的32次方个序号。TCP是面向数据流的,TCP传送的报文可以看成连续的数据流,在一个TCP连接的传输中的每一个字节都对应一个序号。整个数据流起始端的序号在连接建立的时候设置。首部中的序号字段的值指的是本报文段发送的第一个字节的序号。例如,某报文段的序号字段值是301,而携带的数据共有100个字节。这就表明:本报文段的数据的第一个字节的序号是301,最后的一个字节是401.显然下一个报文段的数据序号应当从401开始,因而下一个报文段的序号字段值应为401

(3)确认号:

占4个字节,是期望收到对方下一个报文段第一个数据字节的序号。例如,B收到了A发送过来的一个报文段,其序号字段值是501,而数据长度是200字节,这表明B正确收到了A发送 的序号501到700之间的数据。因此,B期望收到A的下一个数据号就是701,于是B在发送给A的报文段中把确认号设置为701。

(4)数据偏移

占4位,它指出TCP报文段的数据起始处距离TCP报文段的起始处有多远。这实际上就是TCP报文段首部的长度。由于首部长度不固定(因首部中还有长度不确定的选项字段),因此数据偏移是有必要的。但他的单位不是字节,而是32位字(即以4字节长的字为计算单位),数据偏移的最大值是60字节,这也是TCP首部的最大长度。

(5)保留

占6位,保留为日后使用,但目前应设置为0.

(6)紧急URG

当URG=1时,表明紧急指针字段有效。它告诉系统此报文段中有紧急数据,应尽快传送(相当于优先级高的数据),而不需要按原来的排队顺序来传送。

当URG=1时,发送应用进程就告诉发送TCP这两个字符是紧急数据。于是发送TCP就将这两个字符插入到报文段的数据的最前面,其余的数据就是普通数据。这时要与首部中紧急指针字段配合使用。紧急指针告诉本报文段中的紧急数据共有多少字节。紧急数据到达接收方被处理完毕后,回复正常操作。值得注意的是,窗口为0也可以发送紧急数据。

(7)确认ACK

只有当ACK=1时确认号字段才有效。

(8)推送PSH

当两个程序在进行交互式通信的时候,如果一个程序希望立马得到另一个程序的回应,可以使用推送操作。发送方TCP将PSH设置为1,并立即创建一个报文段发送出去,而不用等到缓存满的时候再发送出去。

(9)复位RST

当RST=1时,表明tcp链接中出现严重差错,必须释放连接,然后重新建立运输连接。RST置1还用来拒绝一个非法的报文段或拒绝打开一个链接。RST也可以称之为重建位或重置位。

(10)同步SYN

在连接建立时用来同步序号。当SYN=1,ACK=0时,表明这是一个连接请求报文段。若对方同意建立连接,则在相应的报文段里使SYN=1,ACK=1。因此,SYN=1就表示这是一个连接请求或者连接接受的报文段。

(11)终止FIN

用来释放一个连接。当FIN=1时,表明此报文段的发送方的数据已发送完毕,并要求释放运输连接。

(12)窗口

占2个字节。窗口值在0到2的16次方-1之间。窗口字段用来控制对方发送的数据量,单位为字节。计算机网络经常是用接收方的实际接受能力来控制发送方的数据发送量。TCP也是如此。TCP连接的一端根据设置的缓存空间大小确定自己的接受窗口大小值,然后再通知对方以确定对方发送窗口的上限。比如,设TCP两端主机分别为A和B,首先,A确定自己的接收窗口的大小为x,则A发送给B的tcp报文段的窗口字段中写入x的数值。这就是告诉B的TCP你所能发的数据量的最大上限就是从确认号开始往后推x个字节。同理,B向A发送的报文段也有一个接收窗口上限,但这是A所能发送的最大数据量,不要弄混淆。

(13)检验和

占2个字节。检验和字段检验的范围包括首部和数据这两部分。和UDP用户数据报一样,在计算检验和的时候,需要在首部前面加上12个字节的伪首部。格式与UDP类似,只不过要将伪首部中的第四个字段中的17改为6(tcp协议的协议号是6).

(14)选项

长度可变。TCP只规定了一种选项,即最大报文段长度MSS。MSS告诉对方tcp:“我缓存所能接受的报文段的数据字段的最大长度是MISS字节。”当没有设置选项的时候,tcp的首部长度为20字节。

大家在此要注意MSS值和窗口值得区别:MSS值是指缓存所能容纳的最大容量;窗口值是指一次性发送的最大值。



原创粉丝点击