TCP/IP知识点收集
1 TCP分段
在TCP/IP协议栈中,"MSS"(Maximum Segment Size)是一个关键参数,它指定了TCP协议在发送数据时可以使用的最大数据段(segment)的大小。这个参数是TCP连接建立时通过三次握手(three-way handshake)过程中的一个选项来协商的。
MSS的作用
- 效率:通过选择适当的MSS,TCP可以优化数据传输的效率。过大的MSS可能导致数据包在网络中分片(fragmentation),而过小的MSS则可能增加网络上的包数量,从而增加开销。
- 避免IP分片:IP层在传输数据包时有一个最大传输单元(MTU)的限制。如果TCP数据段的大小超过MTU,IP层就会对其进行分片。但是,分片会增加数据丢失的风险,并可能降低传输效率。因此,选择一个合适的MSS可以避免或减少IP分片的发生。
MSS的确定
- 默认值:不同的操作系统和网络环境可能使用不同的MSS默认值。例如,在以太网环境中,常见的MSS默认值为1460字节(基于1500字节的MTU减去IP头部和TCP头部的长度)。
- 协商:在TCP连接建立时,客户端和服务器会交换一个称为"MSS选项"的TCP选项,以协商使用哪个MSS值。这通常基于各自的网络环境和配置来确定。
MSS与MTU的关系
MSS和MTU之间存在一定的关系。MSS是TCP层可以发送的最大数据段大小,而MTU是IP层可以传输的最大数据包大小。为了确保TCP数据段可以在IP层中无需分片地传输,MSS应该小于或等于MTU减去IP头部和TCP头部的长度。
总结
MSS是TCP协议中一个重要的参数,它指定了TCP数据段的最大大小。通过选择合适的MSS值,TCP可以优化数据传输的效率,并避免或减少IP分片的发生。MSS的确定通常基于网络环境和配置,并在TCP连接建立时通过三次握手过程中的选项来协商。
2 IP分片
TCP/IP分片是在TCP/IP协议栈中,特别是在网络层(IP层)处理数据传输时的一个重要概念。以下是关于TCP/IP分片的详细解释:
定义
TCP/IP分片:当IP数据报的大小超过链路层帧所允许的最大传输单元(MTU)时,网络层(IP层)会将数据报拆分成多个较小的片段(fragments),并在目标主机上进行重新组装的过程。
原因
- MTU限制:不同的物理网络会规定链路层数据帧的最大长度,即MTU。当IP数据报加上数据帧头部后长度大于链路MTU时,就需要进行分片。
- 网络设备限制:某些网络设备可能只能接收和处理较小的数据包,因此需要将较大的数据包进行分片以适应这些设备的限制。
分片过程
- 检查数据包大小:IP层在发送数据前会检查数据包的大小是否超过MTU。
- 计算分片:如果需要分片,IP层会计算需要分成的片段数量以及每个片段的大小。
- 添加分片信息 :每个分片都会包含一些额外的信息,如标识符(Identification)和片偏移(Fragment Offset),以便在目标主机上进行重新组装。
- 标识符:一个唯一的数值,用于标识属于同一原始数据报的所有分片。
- 片偏移:表示该分片在原始数据报中的位置。
- 发送分片:每个分片都会作为独立的IP数据报进行发送。
重新组装
在目标主机上,IP层会根据标识符和片偏移信息将所有收到的分片重新组装成原始的IP数据报。然后,该数据报会被传递给传输层(如TCP)进行进一步处理。
注意事项
- MTU的发现:为了避免不必要的分片,TCP/IP协议栈通常会使用一种称为"路径MTU发现"(Path MTU Discovery)的机制来动态地确定两个主机之间的MTU。
- 分片的开销:虽然分片可以确保数据包在网络中的传输,但它也会增加一些额外的开销,如额外的头部信息和处理时间。
- 分片与分段:需要注意的是,分片是在网络层(IP层)进行的,而分段是在传输层(如TCP层)进行的。TCP层会将应用层的数据分成多个段(segments),而每个段都可能会在网络层被进一步分片。
总结
TCP/IP分片是确保数据包在网络中有效传输的一种重要机制。它允许IP层在必要时将数据包拆分成多个较小的片段,并在目标主机上进行重新组装。通过合理地设置MTU和使用路径MTU发现机制,可以减少不必要的分片并提高数据传输的效率。
3 TCP粘包 Sticky Packet
1. 定义:
TCP粘包(或称为粘包现象)是指在TCP协议中,发送方发送的两个或多个数据包在接收方被接收时,可能会合并成一个数据包的现象。这主要是因为TCP是一个流协议(stream-based protocol),它不会保留数据包之间的边界信息。
2. 产生原因:
TCP为了提高传输效率,可能会在收集到足够多数据后才一起发送。
接收方收到的数据会保存在缓存中,如果应用层提取数据不够快,就会导致缓存中多条数据粘在一起。
3. 处理方式:
关闭Nagle算法(通过TCP_NODELAY选项)。但这样做会降低TCP的传输效率。
在应用层处理粘包问题,如循环处理接收到的数据,或使用特定的数据格式(如添加开始符和结束符)来区分不同的数据包。
UDP与TCP的对比
UDP是一个无连接的、不可靠的传输协议,它发送的每个数据报都被视为独立的单元,因此不存在粘包问题。UDP适用于对实时性要求较高、对数据完整性要求不高的应用场景。
而TCP是一个面向连接的、可靠的传输协议,它通过复杂的控制机制确保了数据的可靠传输,但也因此可能出现粘包现象。TCP适用于需要确保数据完整性和顺序性的应用场景。
总结
在TCP协议中,粘包是一个需要注意的问题,需要在应用层进行适当的处理。而在UDP协议中,由于每个数据报都是独立的,因此不存在粘包问题。选择使用TCP还是UDP取决于具体的应用场景和需求。
4 应答机制
TCP的确认应答机制(ACK)是TCP协议中确保数据可靠传输的关键机制之一。以下是TCP确认应答机制的详细解释:
-
发送与分割:
- 发送方将要发送的数据分割成称为TCP段(TCP segment)的较小单元,并为每个段分配一个唯一的序列号。
- 序列号是一个32位的字段,用于标识TCP源端设备向目的端设备发送的字节流中的位置。
-
发送与确认:
- 发送方将这些TCP段发送给接收方,并启动一个定时器来跟踪每个已发送段的确认。
- 接收方收到TCP段后,会按序将它们重新组装成完整的数据流,并发送一个确认(ACK)给发送方。
-
确认中包含的信息:
- 确认(ACK)中包含接收到的最高序列号,表示该序列号之前的所有数据都已正确接收。
- 当接收方收到一个TCP段后,它不会立即发送一个ACK,而是等待一小段时间(通常称为"延迟ACK"),看看是否还有后续的TCP段可以一并确认,从而提高传输效率。
-
继续发送与重传:
- 发送方在接收到确认后,会停止相应定时器,并继续发送下一个序列号的TCP段。
- 如果发送方在定时器超时之前未收到确认,它将重新发送未确认的TCP段。
-
重复确认与快速重传:
- 如果接收方检测到重复的数据段时,会发送一个重复确认(Duplicate ACK)给发送方。
- 如果发送方收到连续的3个重复确认,它会认为该数据段丢失,并立即重新发送该数据段,这被称为"快速重传"。
-
拥塞控制:
- 如果发送方的数据段未在一定时间内(称为超时时间)内收到确认,它会认为网络发生了拥塞,并减慢发送速率,以减轻网络负载。
通过确认应答机制,TCP可以确保数据的可靠传输,因为发送方和接收方之间会进行双向的确认和重传操作,以确保数据的完整性和正确性。这种机制在TCP协议中起到了至关重要的作用,使得TCP成为了一个广泛应用于各种网络环境中的可靠传输协议。