【连接】:用于保证可靠性和流量控制维护的某些状态信息,包括Socket、序列号和窗口大小
【 TCP 连接】:建立一个TCP连接需要客户端与服务器端达成上述三个信息的共识。
Socket:由 IP 地址和端口号组成序列号:用来解决丢包,重复和乱序问题窗口大小:用来做流量控制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 连接都要占用一定内存,操作系统是有限的。
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 分片了。