[计算机网络] TCP 协议

    技术2022-07-13  64

    文章目录

    TCP 头部格式为什么需要 TCP什么是 TCP什么是 TCP 连接唯一确定一个 TCP 连接UDP 头部格式UDP 包长度 和 TCP 首部长度TCP 和 UDP 区别MSS 与 MTU

    TCP 头部格式

    为什么需要 TCP

    IP 层是「不可靠」的:它不保证网络包的交付、不保证网络包的按序交付、也不保证网络包中的数据 的完整性。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 头部格式

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

    UDP 包长度 和 TCP 首部长度

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

    TCP 和 UDP 区别

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

    MSS 与 MTU

    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。

    IP 的数据大小如果超过 MTU 大小,则在IP层进行分片,所有分片都有 IP 头部,目标主机收到后,也将在IP层组装,然后传给传输层 。但是 TCP 报文被 MTU 分片的时候,只有第一个分片有 TCP 头部,接收方只有重组了这些分片,才会认为是一个 TCP 报文,所以如果丢失了其中一个分片,接收方 IP 层就不会把 TCP 报文传给 TCP 层,而是等待对方超时重传这一整个TCP 报文。( IP 层本身没有超时重传机制,它由传输层的 TCP 来负责超时和重传。)

    UDP 协议没有自己的传输控制机制,完全使用 IP 层提供的能力进行不可靠传输。

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

    Processed: 0.011, SQL: 9