TCP连接;TCP报文段结构;可靠数据传输

TCP是面向连接的:在一个应用进程开始向另一个应用进程发送数据之前,这两个进程必须相互发送某些预备报文段,以建立确保数据传输的参数(三次握手)。

tcp连接状态完全保留在两个端系统中。TCP协议只在端系统中运行,不在中间的路由器和链路层交换机中运行,故中间的网络元素不会维持TCP连接状态。中间路由器对TCP连接完全视而不见,看到的只是数据报,而不是连接。

TCP连接提供全双工服务;是点对点的。

客户进程通过套接字传递数据流,数据一旦通过该门,就由客户中运行的TCP控制,TCP将数据引导到该连接的发送缓存(三次握手初期设置的)里。TCP在它方便时从发送缓存取出数据,以报文段的形式发送数据。从发送缓存中个取出并放入报文段中的数据数量受限于最大报文段长度MSS(报文段里应用层数据的最大长度)。MSS根据最初确定的由本地发送主机发送的最大链路层帧长度(即最大传输单元MTU)设置。设置MSS要保证一个TCP报文段加上TCP/IP首部长度(通常40字节)将适合单个链路层帧。接收端从网络中收到一个报文段后,将报文段的数据放入接收缓存。应用程序从此缓存中读取数据。

TCP每一端都有自己的发送缓存和接收缓存。

TCP报文段结构

TCP报文段由首部字段和数据字段组成:

源端口号(16)

扫描二维码关注公众号,回复: 1117502 查看本文章

目的端口号(16)

序号(32)

确认号(32)

首部长度(4)

保留未用(6)

代码位(6)

接收窗口(16)

因特网检验和(16)

紧急数据指针

选项(长度可变)

填充

数据部份(长度可变)





 


  1. 源端口和目的端口:各占2个字节。
  2. 序号:占4字节。序号范围是0~2^32-1。TCP是面向字节流的,TCP连接中传送的字节流中的每个字节都按顺序编号。整个要传送的字节流的起始序号必须要在连接建立时设置。首部中的序号字段值指的是本报文段所发送的数据的第一个字节的序号。
  3. 确认号:4个字节,是期望收到对方下一个报文段的第一个数据字节的序号。 
    若确认号=N,则表明:到序号N-1为止的所有数据都已正确收到。
  4. 首部长度:4位。指出TCP报文段的数据起始处距离报文段的起始处有多远。这个字段实际上是指出TCP报文段的首部长度。由于首部中还有长度不确定的选项字段,因此数据偏移字段是必要的。单位是32位,也就是4字节,4位二进制最大表示15,所以数据偏移也就是TCP首部最大60字节(通常选项字段为空,故TCP首部的典型长度为20字节)
  5. 保留:6位 
    下面有6个控制位说明本报文段的性质:
  6. 紧急URG:1位 
    当URG=1时,表明紧急指针字段有效。它告诉系统此报文段中有紧急数据,应尽快传送(相当于高优先级的数据),而不要按原来的排队顺序来传送。例如,已经发送了很长的一个程序在远地的主机上运行。但后来发现了一些问题,需要取消该程序的运行。因此用户从键盘发出中断命令(Control+c)。如果不使用紧急数据,那么这两个字符将存储在接收TCP的缓存末尾。只有在所有的数据被处理完毕后这两个字符才被交付接收方的应用进程。这样做就浪费了许多时间。

    当URG置为1时,发送应用进程就告诉发送方的TCP有紧急数据要传送。于是发送方TCP就把紧急数据插入到本报文段数据的最前面,而在紧急数据后面的数据仍时普通数据。这时要与首部中紧急指针字段配合使用。

  7. 确认ACK 
    仅当ACK=1时确认号字段才有效。当ACK=0时,确认号无效。TCP规定,在连接建立后所有的传送的报文段都必须把ACK置1。

  8. 推送PSH 
    当两个应用进程进行交互式的通信时,有时在一端的应用进程希望在键入一个命令后立即就能收到对方的响应。在这种情况下,TCP就可以使用推送操作。这时,发送方TCP把PSH置1,并立即创建一个报文段发送出去。接收方TCP收到PSH=1的报文段,就尽快地交付接收应用进程,而不再等到整个缓存都填满了后向上交付。

    虽然应用程序可以选择推送操作,但推送还很少使用。

  9. 复位RST 
    tcp连接出现严重差错时释放连接,然后重新建立连接。而可以用来拒绝一个非法的报文段或拒绝打开一个连接。

    当RST=1时,表明TCP连接中出现严重差错(如由于主机崩溃或其他原因),必须释放连接,然后再重新建立运输连接。RST置1还用来拒绝一个非法的报文段或拒绝打开一个连接。

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

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

  12. 接收窗口 占2字节。窗口值是【0,2^16-1]之间的整数。窗口指的是发送本报文段的一方的接收窗口(而不是自己的发送窗口)。窗口值告诉对方: 从本报文段首部中的确认号算起,接收方目前允许对方发送的数据量。之所以要有这个限制,是因为接收方的数据缓存空间是有限的。总之,窗口值作为接收方让发送方设置其发送窗口的依据。并且窗口值是经常在动态变化着。

  13. 检验和:2字节。检验范围包括首部数据两部分。和UDP用户数据报一样,在计算校验和 时,要在TCP报文段加上12字节的伪首部。

  14. 紧急指针:2字节。紧急指针仅在URG=1时才有意义,它指出本报文段中的紧急数据的字节数(紧急数据结束后就是普通数据)。因此,紧急指针指出了紧急数据的末尾在报文段中的位置。当所有紧急数据都处理完时,TCP就告诉应用程序恢复到正常操作。值得注意的是,即使窗口为零时也可发送紧急数据。

  15. 选项:长度可变,最长可达40字节。当没有使用“选项”时,TCP的首部长度是20字节。 
    1)MSS 最大报文段长度 
    MSS最大报文段长度(数据字段的最大长度,默认是536字节)。MSS不宜设的太大也不宜设的太小。若选择太小,极端情况下,TCP报文段只含有1字节数据,在IP层传输的数据报的开销至少有40字节(包括TCP报文段的首部和IP数据报的首部)。这样,网络的利用率就不会超过1/41。若TCP报文段非常长,那么在IP层传输时就有可能要分解成多个短数据报片。在终点要把收到的各个短数据报片装配成原来的TCP报文段。当传输出错时还要进行重传,这些也都会使开销增大。

    因此MSS应尽可能大,只要在IP层传输时不需要再分片就行。在连接建立过程中,双方都把自己能够支持的MSS接入这一字段,以后就按照这个数值传送数据。 
    2)窗口扩大 
    窗口扩大选项是为了扩大窗口。TCP首部中窗口字段长度是16位,因此最大窗口大小就是64k字节。对于包含卫星信道的网络可能是不够用的。可以在双方初始建立TCP连接的时候就进行协商。 
    3)时间戳(计算RTT,防止序号绕回) 
    A. 用来计算往返时间RTT。发送方在发送报文段时把当前时钟的时间值放入时间戳字段,接收方在确认该报文段时把时间戳字段值复制到时间戳回送回答字段。因此,发送方在收到确认报文后,可以准确地计算RTT来。 
    4)选择确认选项

可靠数据传输

TCP的发送方有3个与发送和重传有关的主要事件:

(1)、从上层引用程序接收数据。

TCP从应用程序接收数据,将数据封装在报文段中,并把该报文段交给IP。每个报文段都有一个序号(报文段第一个数据字节的字节流编号)。若定时器还没为某些其他报文段运行,则当报文段被传给IP时启动该定时器。

(2)、定时器超时。

TCP通过重传引起超时的报文段来响应超时事件,然后TCP重启定时器

(3)、收到ACK。

TCP将ACK的值与它的变量sendbase(最早未被确认的字节序号)比较。TCP采用累积确认。ACK的值确认了字节编号在ACK之前的所有字节都已经收到。若ACK的值>sendbase,则该ACK是在确认一个或多个先前未被确认的报文段,因此发送方更新sendbase变量;若当前有未被确认的报文段,TCP还要重新启动定时器

1、三种有趣的情况:


2、超时时间加倍

超时事件发生时,TCP重传具有最小序号的还未被确认的报文段,每次TCP重传时都会将下一次的超时间隔设为先前值的两倍。

3、快速重传

超时触发重传超时周期可能相对较长,当一个报文段丢失时,长超时周期迫使发送方延迟重传丢失的分组,增加了端到端时延。

发送方可在超时事件发生之前通过注意冗余ACK来较好检测到丢包情况。当TCP接收方收到一个具有序号的报文段时,其序号大于下一个所期望的、按序的报文段,即有报文段丢失,因TCP不适用否定确认,故只是对已收到的最后一个按序字节数据进行重复确认(产生一个冗余ACK)。

若TCP发送方接收到对相同数据的3个冗余ACK,说明跟在这个已被确认过3次的报文段之后的报文段已经丢失,TCP执行快速重传,即在该报文段的定时器过期之前重传丢失的报文段。



TCP的差错恢复机制为GBN协议和SR协议的混合体:发送方仅需维持已发送但未被确认的字节的最小序号和下一个要发送的字节的序号(GBN)。TCP实现会将正确接收但失序的报文段缓存器起来(SR)。TCP接收方可有选择的确认失序报文段,而不是累积地确认最后一个正确接收的报文段。


猜你喜欢

转载自blog.csdn.net/qq_22238021/article/details/80328779