Chapter 3

TCP and IP

Introduction

Transmission Control Protocol (TCP)

User Datagram Protocol (UDP)

Internet Protocol (IP)

IPv6

TCP

RFC 793, RFC 1122

Outgoing data is logically a stream of octets from user

Stream broken into blocks of data, or segments

TCP accumulates octets from user until segment is large enough, or data marked with PUSH flag

User can mark data as URGENT

当然,以下是对TCP(传输控制协议)相关内容的详细解读,涵盖RFC 793和RFC 1122的关键点,以及您提到的具体机制。

一、TCP概述

1. 什么是TCP?

TCP(Transmission Control Protocol,传输控制协议)是互联网协议族(TCP/IP)中的核心协议之一,位于传输层。它提供可靠、面向连接的字节流服务,确保数据在不可靠的网络上可靠传输。

2. RFC 793 和 RFC 1122

RFC 793:全称为《Transmission Control Protocol》,由Jon Postel在1981年发布,定义了TCP的基本功能和行为,包括连接管理、数据传输、流量控制、拥塞控制等。

RFC 1122:全称为《Requirements for Internet Hosts - Communication Layers》,发布于1989年,进一步明确了主机在互联网通信层(包括TCP)的实现要求和标准,确保不同系统间的互操作性。

二、TCP数据传输机制

1. 出站数据作为用户的字节流

在TCP中,应用程序向TCP传输的数据被视为一个连续的字节流(stream of octets)。这意味着数据的边界由应用层管理,TCP负责在网络上传输这些字节,确保顺序和完整性。

2. 字节流的分段(Segmentation)

尽管用户提供的是一个连续的字节流,TCP在实际传输时需要将其分割成适当大小的数据块,称为段(Segment)。分段的目的是适应底层网络的最大传输单元(MTU)和有效利用网络带宽。

分段过程:

缓冲区积累:TCP会在发送缓冲区中积累来自用户的数据,直到满足一定条件后进行分段和发送。

段大小:通常,TCP段的大小取决于路径MTU(最大传输单元),减去TCP和IP头部的大小。例如,以太网的MTU通常是1500字节,减去20字节的IP头和20字节的TCP头,剩余1460字节用于数据。

3. 段的发送条件

TCP决定何时将积累的字节流分割成段并发送,主要基于以下条件:

足够大的数据积累:当发送缓冲区中积累的数据达到一个预定的阈值(通常接近最大段大小MSS)时,TCP会将这些数据打包成一个段并发送。

PUSH标志(PSH Flag):如果应用程序希望立即发送当前的数据而不等待缓冲区积累更多的数据,可以设置PSH标志。收到PSH标志的TCP段会促使接收端的TCP尽快将数据传递给应用程序,而不等待更多数据的到来。

PUSH标志的作用:

即时传输:确保用户数据被立即传输,而不是等待缓冲区填满。

流量控制:适用于需要实时传输的应用,如交互式应用或实时通信。

4. 紧急数据(Urgent Data)

TCP允许用户将某些数据标记为紧急(URGENT),表示这些数据应优先处理。紧急数据通常用于需要立即处理的特殊情况,如中断命令。

URG 标志的使用:

URG 标志:TCP段头中的URG位被设置,表示该段包含紧急数据。

紧急指针(Urgent Pointer):指示紧急数据的结束位置,使接收端能够识别并优先处理这些数据。

紧急数据的处理:

接收端处理:接收端的TCP会将紧急数据优先交给应用程序处理,而不会按照普通数据的顺序进行处理。

应用场景:例如,远程终端中的中断信号(如Ctrl+C)可以通过紧急数据传输,以确保立即中断当前操作。

三、TCP的可靠性机制

为了实现可靠的数据传输,TCP采用了一系列机制,包括:

1. 序列号和确认应答(Sequence Numbers and Acknowledgments)

序列号(Sequence Number):每个字节流中的字节都有一个唯一的序列号,确保数据按顺序传输。

确认应答(ACK):接收端通过发送确认应答,告知发送端已成功接收的数据字节。

2. 重传机制(Retransmission)

超时重传:如果发送端在预定时间内未收到确认应答,会重传未被确认的数据段。

快速重传:当发送端收到连续的重复确认(表明某个段可能丢失),会立即重传相关段。

3. 流量控制(Flow Control)

窗口大小(Window Size):接收端通过窗口大小告知发送端其缓冲能力,防止发送端过快发送数据导致接收端缓冲溢出。

4. 拥塞控制(Congestion Control)

避免网络拥塞:TCP通过算法(如慢启动、拥塞避免、快重传和快恢复)动态调整发送速率,避免引发网络拥塞。

四、TCP连接管理

1. 三次握手(Three-Way Handshake)

建立TCP连接需要经过三次握手过程:

  1. SYN:客户端发送一个SYN(同步)段,初始化连接。

  2. SYN-ACK:服务器回应一个SYN-ACK段,确认连接请求。

  3. ACK:客户端发送一个ACK段,确认连接建立。

2. 四次挥手(Four-Way Teardown)

断开TCP连接通常需要四次挥手过程:

  1. FIN:一方发送FIN(终止)段,表示不再发送数据。

  2. ACK:接收方确认FIN段。

  3. FIN:接收方发送FIN段,表示也不再发送数据。

  4. ACK:发送方确认FIN段,连接关闭。

五、实践中的TCP应用

理解TCP的工作原理对于开发稳定和高效的互联网应用至关重要。以下是一些实践中的应用场景:

1. Web服务器和客户端

HTTP协议(尤其是HTTP/1.1)基于TCP,确保网页和资源的可靠传输。

2. 数据库通信

数据库客户端与服务器之间的通信通常通过TCP连接,确保数据查询和传输的准确性。

3. 实时通信应用

虽然UDP在实时性方面有优势,但某些实时应用仍然依赖TCP的可靠传输机制,如即时消息传递服务。

4. 文件传输

FTP、SFTP等文件传输协议依赖TCP确保文件的完整传输。

六、总结

TCP作为一种可靠、面向连接的传输协议,在互联网应用中扮演着至关重要的角色。理解其基本机制、数据传输方式以及相关的控制策略(如分段、PUSH标志、紧急数据)对于开发高效、稳定的应用至关重要。通过深入学习RFC 793和RFC 1122,您可以更好地理解TCP的内部工作原理,从而在实际开发中更好地应用这些知识。

如果您有更多具体问题或需要进一步的详细解释,请随时提问!

Similarly, incoming data is a stream of octets presented to user

Data marked with PUSH flag triggers delivery of data to user, otherwise TCP decides when to deliver data

Data marked with URGENT flag causes user to be signaled

当然,以下是对您提出的TCP(传输控制协议)相关概念的详细解读,重点解释了以下三点:

  1. 类似地,传入数据是呈现给用户的字节流

  2. 标记有PUSH标志的数据会触发数据交付给用户,否则TCP决定何时交付数据

  3. 标记有URGENT标志的数据会导致用户被通知

这些概念主要来源于RFC 793和RFC 1122,下面将逐一详细说明。

一、传入数据作为呈现给用户的字节流

1. 字节流模型

TCP提供一种面向连接的字节流服务。这意味着:

连续性:应用程序通过TCP发送和接收的数据被视为一个连续的、无结构的字节序列(octet stream)。数据的边界由应用层定义,而TCP只负责可靠地传输这些字节。

顺序性:TCP确保数据按发送顺序到达接收端,即使网络中数据包乱序,TCP也会重新排序。

可靠性:通过确认应答和重传机制,TCP确保所有字节都被可靠地传输到接收端。

2. 数据交付给用户

在接收端,TCP将传入的数据流交付给应用程序,具体过程如下:

接收缓冲区:TCP在接收端维护一个缓冲区,用于存储从网络接收到的数据。应用程序通过系统调用(如read或recv)从缓冲区中读取数据。

数据边界:由于TCP是字节流协议,应用层需要自行定义数据的边界。例如,HTTP协议通过特定的语法(如HTTP头部和内容长度)来划分请求和响应。

3. 与面向报文的协议的对比

与TCP不同,UDP是面向报文的协议,它保留了发送方发送的数据报文的边界。因此,应用层在处理数据时需要考虑不同的处理方式。

二、PUSH标志(PSH Flag)对数据交付的影响

1. PUSH标志的定义

PUSH(PSH)标志位是TCP头部的一个控制位,用于指示接收端应尽快将接收到的数据传递给应用程序,而不需要等待缓冲区填满。

2. PUSH标志的作用

即时传递:当发送端在TCP段中设置PSH标志时,接收端的TCP会立即将当前接收到的数据交付给应用程序,即使接收缓冲区中还有更多的数据未填满。

优化实时性:适用于需要低延迟的数据传输场景,如交互式应用(例如,终端会话、实时游戏等),确保用户能尽快收到并处理数据。

3. TCP决定何时交付数据

如果数据段没有设置PSH标志,TCP在接收端会根据以下策略决定何时将数据交付给应用程序:

缓冲区满:当接收缓冲区中的数据达到一定阈值时,TCP会将这些数据传递给应用程序。

4