美文网首页
2.TCP服务

2.TCP服务

作者: 辉神来了 | 来源:发表于2019-07-09 00:42 被阅读0次
  • 尽管TCP和UDP 都使用相同的网络层(IP),TCP 却向应用层提供与UDP 完全不同的服务,TCP 提供一种面向连接的、可靠的字节流服务
  • 面向连接意味着两个使用TCP的应用(通常是一个客户和一个服务器)在彼此交换数据之前必须先建立一个TCP连接。这一过程与打电话很相似,先拨号振铃,等待对方说:“喂 ”然后才说明是谁 ,在一个TCP 连接中,仅有两方进行彼此通信 。
TCP通过下列方式来提供可靠性:
  • 应用程序被分割成TCP认为最适合发送的数据块,这和 UPD完全不同,应用程序产生的数据报长度将保持不变,由TCP传递给IP的信息单位称为报文段或段 (segment)

  • 当TCP发出一个段后,它启动一个定时器,等待目的端确认收到这个报文段,如果不能及时收到一个确认,将重发这个报文段,(TCP协议中自适应的超时及重传策略)

  • 当TCP 收到发自TCP连接另一端的数据,它将发送一个确认,这个确认不是立即发送,通常将推迟几分之一秒

  • TCP将保持它首部和数据的校验和,这一个端到端的校验和,目的是检测数据在传输过程中的任何变化,如果收到段的校验和有差错,TCP将丢弃这个报文段和不确认收到此报文段(希望发端超时并重发)

  • 既然TCP 报文段作为IP数据来传输,而IP数据报到达可能会失序,因此TCP报文段的到达也可能会失序,如果必要,TCP将对收到的数据进行重新排序将收到的数据以正确的顺序交给应用层

  • 既然IP数据报会发生重复,TCP的接收端必须丢弃重复的数据

  • TCP 还能提供流量控制,TCP连接的每一方都有固定大小的缓冲区, TCP的接受端只允许另一端发送接收端缓冲区所能接纳的数据 ,这将防止较快主机导致较慢主机缓冲区溢出

  • 两个应用程序通过TCP 连接交换8bit字节构成的字节流,TCP 不在字节流中插入记录标识符,我这这称为 字节流服务,如果一方应用程序先传10字节,又传20字节,再传50字节,连接的另一方将无法了解触发每次发送了多少字节,,收方可以分4次接受这80个字节,每次接收20字节,一端将字节流放到TCP连接上,同样的字节流将出现在TCP连接到另一端,另外,TCP对字节流的内容不作任何解释,TCP不知道传输的字节流是二进制数据,还是ASCII 字符、EDCDIC字符或其他类型数据,对字节流的解释由TCP连接双方的应用层解释,这种对字节流的处理方式与Unix操作系统对文件处理方式很相似,Unix的内核对一个应用读或写的内容不作任何解释,而是交给应用程序处理,对Unix的内核来说,它无法区分一个二进制文件与一个文本文件

TCP 首部
image.png

TCP首部有20个字节的固定数据,用来存放报文传输过程所需的信息。各字段的含义如下:

  • 源端口,目的端口 各占2个字节。

  • 序号又叫“报文段序号”,占4个字节。因为TCP是面向字节的,尽管一次报文传输的字节数不同,但是每个数据段的字节都有对应的序号。
    比如,发送方,该字段值是1001,发送的数据为1000字节,这这段数据开始字节的序号是1001,最后一个字节的序号2000。

  • 确认号占4个字节,是期望发送方下一个报文第一个字节的序号值。 例如接收方接受到发送方的报文,其中序号字段值是2001,数据区长度为2000个字节。那么接受下次接受发送发送的报文中,开始的序号值,应该是4001。所以在接收方回答上述报文时,会在确认号字段写:4001。所以,如果确认号是N,则表示N-1个序号的字节数据已成功接收。确认号占4个字节,可以对4GB的数据进行编号。

  • 数据偏移占4位,表示报文中除开有效数据段,报文首部的长度。所以数据偏移的最小值是20字节(固定首部)。注意,数据偏移的计算单位是32位字,即4字节长的字。所以对于,占4位的数据偏移字段。最大值是:15 * 4 = 60字节。

  • 保留占6位,目前置为0,今后使用

  • 控制位共有6个控制位,意义分别如下:

    1)紧急URG占1位,当URG值为1时,发送方应用程序,告诉发送方的TCP有紧急数据需要处理,TCP就将紧急数据放到数据区的最前面。紧跟其后是普通数据。
    2)确认ACK占1位,当连接建立后,ACK必须置为1,仅当ACK=1时,确认号才有效。当ACK=0,确认号是1。这是因为确认号是希望下次接受到的数据第一个字节序号,但是ACK=0时,连接都还没建立,不可能传送有效数据。
    3)推送PSH占1位,当PSH值为1时,发送方会立即创建一个报文段发送出去,接收方接收到PSH字段为1的值时,会立即将该报文中的数据交付接收应用程序,不用等到整个缓存填满了后再向上交付。
    4) 复位RST占1位,当RST置为1时,用来拒绝一个非法的报文段和拒绝打开一个连接,RST也可称为重建位或者重置位。
    5)同步SYN占1位,用在连接建立时同步序号。当SYN置为1时,表示连接请求或连接接受报文。
    6)终止FIN当FIN=1,表示发送发的数据已发送完毕,请求释放连接。

  • 窗口 占2个字节,作为接收方让发送方设置起发送窗口的依据,以字节为单位。例如,发送了一个报文段,起确认号1001(期望下一个收到的报文中,数据区第一个字节的序号是1001),窗口字段是1000。就是告诉对方:“从1001开始,我最多只能接受1000个字节的数据,你发送数据的时候考虑下这点。窗口值是动态变化的。

  • 校验和发送方在发送报文前,会加上在前面加12字节的伪首部,计算校验和。然后写入该字段。当接收方接收到数据,同样计算校验和。

  • 紧急指针占2个字节。在URG=1时,表示紧急数据的长度,指出了紧急数据的末尾在报文段的位置。当窗口值为0时,也可以发送紧急数据。

  • 选项

  • MSS Maximum Segement Sie, 即最大报文段,但是正确的含义,是最大的数据区长度。当不设置,默认是536字节。所以互联网中的主机,都可以接收的报文段长度是536+20(固定首部)=556字节。

  • 窗口扩大占3个字节,其中有一个字节表示移位值S。新的窗口值等于 2^(16 + S)。

  • 时间戳,时间戳回送回答
    计算RTT
    用时间戳回送回答字段,减去时间戳字段值,就能得出报文往返的时间。
    PAWS
    防止序号绕回。即在序号重复时,利用该字段区别是新报文,还是迟到的报文。

  • SACK

Selective Acknowledgment,选择确认。

image

从上图看出,每个不连续字节块有2个边界。我们知道首部选项长度最长为40(60- 20)字节。指明一个边界需要4个字节,所以最多能指明4个不连续字节块的边界信息( 4 * 4 * 2 =32字节 )。这是因为,指明5个不连续字节块的边界信息,则需要 (4 * 5 * 2 = 40个字节),而头部还需要两个字节,一个用来指明SACK选项,一个用来指明SACK占用的字节数。那么总数变成40+2= 42字节,这超过了报文允许的最大选项长度40字节。

  • TCP 可以表述为一个没有选择确认或否文的滑动窗口协议(滑动窗口协议用于数据传输),我们说TCP缺少选择确认是因为TCP首部中的确认序号表示发方已成功收到字节,但还不包括确认序号所指的字节,当前还无法对数据中选定的部分进行确认,例如,如果11024字节已经成功收到,下一报文段中包含序号从20493072的字节,收端并不确认这个新报文段,它所能做的就是发回一个确认序号为1025的ACK

相关文章

网友评论

      本文标题:2.TCP服务

      本文链接:https://www.haomeiwen.com/subject/vcgzhctx.html