TCP/IP详解之第17章-TCP:传输控制协议

知识要点

  • TCP和UDP均使用IP协议作为网络层,但TCP提供的是一种面向连接且可靠的字节流服务。

    1
    2
    3
    4
    5

    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
    | IP header | TCP header | TCP payloa |
    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
    20 bytes 20 bytes
  • TCP提供的是字节流服务,不对字节流的内容作任何解释,解释权交给应用层。

    应用层产生的全体数据与真正发送的单个IP数据报不存在必然的联系。

  • TCP提供的是双工服务,数据在两个方向上课独立地进行传输。

  • TCP首部的固定长度为20字节,最多可有60字节,即任选字段的范围是0~40字节。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
     0                   1                   2                   3
    0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
    | Source Port | Destination Port |
    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
    | Sequence Number |
    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
    | Acknowledgment Number |
    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
    | Data | |U|A|P|R|S|F| |
    | Offset| Reserved |R|C|S|S|Y|I| Window |
    | | |G|K|H|T|N|N| |
    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
    | Checksum | Urgent Pointer |
    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
    | Options | Padding |
    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
    | data |
    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  • TCP首部的“首部长度”字段占4bit,单位为4字节,表示TCP首部与数据的分界线。

  • TCP首部中有6个标志比特:

    • URG:紧急指针
    • ACK:确认序号有效
    • PSH:接收端应尽快将此报文段交给应用层
    • RST:重建连接
    • SYN:启用同步序号建立连接
    • FIN:发送端完成发送任务
  • TCP可靠性保障:

    • TCP提供了分段机制:将应用数据分段(segment)的传递给IP层,以避免触发IP层分片机制。而UDP则会将应用层产生的数据原封不动地传递给IP层。
    • TCP提供了ACK和超时重传机制:一旦超过RTO(Retransmission Timeout)且没有收到某个报文段的ACK就会重传此报文段。
    • TCP提供了端到端的检验和:检验和覆盖TCP首部和数据,一旦检验和有差错,TCP将丢弃报文段和不确认收到此报文段,以触发发送端的超时重传机制。
    • TCP提供了报文段乱序重排机制:TCP将收到的报文段进行重新排序,以正确的顺序传给应用层。
    • TCP提供了重放保护机制:TCP接收端会丢弃重复的报文段。
    • TCP提供了流量控制机制:TCP连接的两端都有指定大小的缓存区,TCP接收端只允许发送端发送其能缓存的数据大小,以防止接收端缓存溢出。

习题解答

  • 我们已经介绍了以下几种分组格式:IP、ICMP、IGMP、UDP和TCP。每一种格式的首部中均包含校验和。对每种分组,说明检验和包括IP数据包中的哪些部分,以及该校验和是强制的还是可选的。

    答:除了UDP的校验和之外,其他的都属强制的。IP分组的检验和只覆盖了首部,ICMP、IGMP、UDP和TCP的检验和都覆盖首部和数据,且都使用IP协议作为网络层,即整个分组就是IP的数据段。

  • 为什么我们已经讨论的所有Internet协议(IP,ICMP,IGMP,UDP,TCP)收到有检验和差错的分组都仅作丢弃处理?

    答:当校验和出现差错时,有三种处理方式:

    1. 立即通知发送端重传
    2. 直接丢弃,等待发送端超时重传
    3. 尝试纠错,比如链路层的CRC(Cyclic Redundancy Check)

    一般情况下,校验和不一致的原因主要是两种情况,分别是校验和本身出错和分组字段出错。特别是当分组中重要字段出错,比如IP地址,源端口号或协议字段等,这种情况下无法将重传反馈给发送端。因此,接收端会选择直接丢弃分组,以等待发送端超时重传。

    此外,为什么只有链路层支持CRC?因为链路层处于底层,且CRC检错能力极强,足以保证较高的传输准确率,故上层协议不需要再额外支持CRC。

  • TCP提供了一种字节流服务,而收发双方都不保持记录的边界。应用程序如何提供它们自己的记录标识?

    答:应用层常用的标识记录的方式有两种:

    • NVT ASCII

      很多应用会使用回车字符(CR)和换行字符(LF)序列来标记某个应用记录的边界,以\r\n表示。比如Telnet以NVT ASCII来描述客户命令和服务器响应,详见章节26.4.1。

    • 字节计数

      通过增加一个长度字段,标识某个记录的长度,比如Sun RPC报文,在TCP头部和XID之间增加一个4字节的字段,表示此RPC的长度,详见章节29.2。

  • 为什么在TCP首部的开始便是源和目的端口号?

    答:ICMP差错报文中包含了IP首部和IP数据报文的前8个字节,当TCP收到ICMP差错报文时,需要通过源和目的端口来确定出错的连接,因此端口号必须包含在TCP首部的前8个字节里面。至于为什么源和目的端口号放在TCP首部的4个字节,这与ICMP的具体实现相关。同理,UPD的前4个字节也是源和目的端口号。

  • 为什么TCP首部有一个首部长度字段而UDP首部中却没有?

    答:因为TCP首部中包含固定字段和可选字段,固定字段为20字节,可选字段为040字节,因为TCP首部长度是可变的,范围为2040字节。而、因此,首部长度的作用是用于指明TCP首部的真实长度。而UDP的首部长度是固定的,长度为8个字节。

Comments