[计算机网络] TCP 协议

[计算机网络] TCP 协议

TCP 头部格式

[计算机网络] TCP 协议

为什么需要 TCP

  1. IP 层是「不可靠」的:它不保证网络包的交付、不保证网络包的按序交付、也不保证网络包中的数据
    的完整性。
  2. TCP 是 [可靠] 的:工作在传输层的可靠数据传输的服务,能确保接收端接收的网络包是无损坏、无间
    隔、非冗余和按序的。

什么是 TCP

[计算机网络] TCP 协议

什么是 TCP 连接

【连接】:用于保证可靠性和流量控制维护的某些状态信息,包括Socket、***和窗口大小

【 TCP 连接】:建立一个TCP连接需要客户端与服务器端达成上述三个信息的共识。

  • Socket:由 IP 地址和端口号组成
  • ***:用来解决丢包,重复和乱序问题
  • 窗口大小:用来做流量控制

唯一确定一个 TCP 连接

TCP 四元组可以唯一的确定一个连接:源地址,源端口,目的地址,目的端口

源地址和目的地址的字段(32位)是在 IP 头部中,作用是通过 IP 协议发送报文给对方主机。
源端口和目的端口的字段(16位)是在 TCP 头部中,作用是告诉 TCP 协议应该把报文发给哪个进程。

有一个 IP 的服务器监听了一个端口,它的 TCP 的最大连接数是多少?

服务器通常固定在某个本地端口上监听,等待客户端的连接请求。因此,客户端 IP 和 端口是可变的,其理论值计算公式如下:

最大 TCP 连接数 = 客户端 IP 数 x 客户端端口数。

对 IPv4,客户端的 IP 数最多为 2 的 32 次方,客户端的端口数最多为 2 的 16 次方,也就是服务端单机最大 TCP 连接数,约为 2 的 48 次方。

当然,服务端最大并发 TCP 连接数远不能达到理论上限。 首先主要是文件描述符限制,Socket 都是文件,所以首先要通过 ulimit 配置文件描述符的数目;另一个是内存限制,每个 TCP 连接都要占用一定内存,操作系统是有限的。

UDP 头部格式

[计算机网络] TCP 协议

  • 目标和源端口:主要是告诉 UDP 协议应该把报文发给哪个进程。(和TCP一致)
  • 包长度:该字段保存了 UDP 首部的长度跟数据的长度之和。(TCP没有包长度,有首部长度)
  • 校验和:校验和是为了提供可靠的 UDP 首部和数据而设计。(TCP也有)

UDP 包长度 和 TCP 首部长度

  1. 为什么 TCP 有首部长度 而 UDP 没有首部长度?
    TCP 有可变长的「选项」字段,而UDP首部长度是固定的
    TCP 负载数据长度 = IP 长度 - IP 首部长度 - TCP 首部长度
  2. 为什么 UDP 有包长度?
    为了网络设备硬件设计和处理方便,首部长度需要是 4 字节的整数倍。为了补全 UDP 首部长度是 4 字节的整数倍,补充了「包长度」字段。

TCP 和 UDP 区别

  1. 面向连接:TCP是面向连接的(传输数据之前要先建立连接);UDP是无连接的(随时可发送),
  2. 服务对象:TCP是一对一的两点服务(因为面向连接),UDP是一对一,一对多,多对多的交互通信。
  3. 可靠性:TCP是可靠的,UDP不可靠(不保证网络包送达,不丢失,不重复,不出错)
  4. 传输方式:TCP是字节流(无边界,按序,不重复),UDP是一个一个包发送(有边界,易丢失,重复,乱序)
  5. 流量控制:TCP有拥塞控制和流量控制(数据传输更安全),UDP无论网络多么拥堵都以相同速率发送
  6. 首部开销:TCP首部较长,在没有选项字节时是20字节;UDP首部固定为8个字节
  7. 分片方式:TCP在传输层按照MSS分片;UDP在IP层按照MTU分片
  8. 应用场景:TCP面向连接,保证数据可靠性交付,用于 HTTP/HTTPS,FTP等;UDP面向无连接,随时可发,简单高效,用于DNS,SNMP,音视频多媒体通信等

MSS 与 MTU

[计算机网络] TCP 协议
MTU: Maximum Transmit Unit,最大传输单元,即物理接口(数据链路层)限制其上层(通常是IP层)最大一次传输数据的大小;以普遍使用的以太网接口为例,缺省MTU=1500 Byte,这是以太网接口对IP层的约束,如果IP层有<=1500 byte 需要发送,只需要一个IP包就可以完成发送任务;如果IP层有> 1500 byte 数据需要发送,需要分片才能完成发送,这些分片有一个共同点,即IP Header ID相同。

MSS:Maximum Segment Size ,TCP提交给IP层最大分段大小,不包含TCP Header和 TCP Option,只包含TCP Payload ,MSS是TCP 用来限制application层最大的发送字节数。如果底层物理接口MTU= 1500 byte,则 MSS = 1500- 20(IP Header) -20 (TCP Header) = 1460 byte,如果application 有2000 byte发送,需要两个segment才可以完成发送,第一个TCP segment = 1460,第二个TCP segment = 540。

UDP 的数据大小如果超过 MTU 大小,则在IP层进行分片,目标主机收到后,也将在IP层组装,然后传给传输层,如果中途丢失了某些分片,则需要重传所有数据包,效率低,所以 UDP 的报文应该小于 MTU 。因为 IP 层本身没有超时重传机制,它由传输层的 TCP 来负责超时和重传。当接收方发现 TCP 报文(头部 + 数据)的某一片丢失后,则不会响应 ACK 给对方,那么发送方的TCP 在超时后,就会重发「整个 TCP 报文(头部 + 数据)」。

TCP 的数据大小如果超过 MSS 大小,则在传输层进行分片,目标主机收到后,也将在传输层组装 TCP 数据包,如果中途丢失了某些分片,只需要传输丢失的这个分片(MSS单位)。所以,为了达到最佳的传输效能, TCP 协议在建立连接的时候通常要协商双方的 MSS 值,当 TCP 层发现数据超过 MSS 时,则就先会进行分片,由它形成的 IP 包的长度也就不会大于 MTU ,自然也就不用 IP 分片了。

[计算机网络] TCP 协议