部分内容来源:小林Coding
TCP的特点
1.面向连接
一定是“一对一”才能连接,不能像 UDP 协议可以一个主机同时向多个主机发送消息,也就是一对多是无法做到的
2.可靠的
无论的网络链路中出现了怎样的链路变化,TCP 都可以保证一个报文一定能够到达接收端
3.字节流
用户消息通过 TCP 协议传输时,消息可能会被操作系统“分组”成多个的 TCP 报文,如果接收方的程序如果不知道“消息的边界”,是无法读出一个有效的用户消息的。
并且 TCP 报文是“有序的”
当“前一个” TCP 报文没有收到的时候,即使它先收到了后面的 TCP 报文,那么也不能够给应用层去处理
同时对“重复”的 TCP 报文会自动丢弃
什么是TCP连接
简单来说就是
用于保证可靠性和流量控制维护的某些状态信息
这些信息的组合包括 Socket、序列号和窗口大小称为连接
所以我们可以知道,建立一个 TCP 连接是需要客户端与服务端达成上述三个信息的共识。
- Socket:由 IP 地址和端口号组成
- 序列号:用来解决乱序问题等
- 窗口大小:用来做流量控制
如何唯一确定一个TCP连接呢
TCP 四元组可以唯一的确定一个连接,四元组包括如下:
1.源地址
2.源端口
3.目的地址
4.目的端口
源地址和目的地址的字段(32 位)是在 IP 头部中,作用是通过 IP 协议发送报文给对方主机。
源端口和目的端口的字段(16 位)是在 TCP 头部中,作用是告诉 TCP 协议应该把报文发给哪个进程
有一个 IP 的服务端监听了一个端口,它的 TCP 的最大连接数是多少?
服务端通常固定在某个本地端口上监听,等待客户端的连接请求。
因此,客户端 IP 和端口是可变的,其理论值计算公式如下:
最大 TCP 连接数 = 客户端的 IP 数 X 客户端的端口数
对 IPv4,客户端的 IP 数量最多为 2 的 32 次方,客户端的端口数量最多为 2 的 16 次方,也就是服务端单机最大 TCP 连接数,约为 2 的 48 次方。
当然,服务端单机能发 TCP 连接数能达到理论上的上限,会受以下因素影响:
文件描述符限制:每个 TCP 连接都是一个文件,如果文件描述符被占满了,会发生 Too many open files。Linux 对于打开的文件描述符数量分别作了三个方面的限制:
系统级:当前系统可打开的最大数量,通过 cat /proc/sys/fs/file-max
查看;用户级:指定用户可打开的最大数量,通过 cat /etc/security/limits.conf
查看;进程级:单个进程可打开的最大数量,通过 cat /proc/sys/fs/nr_open
查看。
内存限制:每个 TCP 连接都会占用一定内存,操作系统的内存是有限的,如果内存资源被占满后,会发生 OOM
UDP和TCP有什么区别?分别应用场景是?
1.连接
TCP是面向连接的传输层协议,传输数据前要先建立连接
UDP是不需要建立连接的,即刻传输数据
2.服务对象
TCP是一对一的两点服务,即一条连接只有两个端点
UDP支持一对一,一对多,多对多的交互通信
3.可靠性
TCP 是可靠交付数据的,数据可以无差错、不丢失、不重复、按序到达。
UDP 是尽最大努力交付,不能保证可靠交付数据。
4.拥塞控制、流量控制
TCP 有拥塞控制和流量控制机制,保证数据传输的安全性。
UDP 则没有,即使网络非常拥堵了,也不会影响 UDP 的发送速率(因为根本不在意发送成功不成功,所以我们速率不用变)。
5.首部开销
TCP 首部较长较复杂,会有一定的开销,首部在没有使用【选项】字段时是 20 个字节,如果使用了【选项】字段则会变长的。
UDP 首部只有 8 个字节,并且固定是不会变的,开销较小。
6.传输方式
TCP 是面向连接,没有边界,但保证顺序和可靠。
UDP 是一个包一个包的发送,是有边界的,但可能会丢包和乱序
7.数据分片所在的层不同
TCP 的数据大小如果大于 MSS 大小,则会在传输层进行分片,目标主机收到后,也同样在传输层组装 TCP 数据包,如果中途丢失了一个分片,只需要传输丢失的这个分片。
UDP 的数据大小如果大于 MTU 大小,则会在 IP 层进行分片,目标主机收到后,在 IP 层组装完数据,接着再传给传输层
TCP和UDP可以使用同一个端口吗
可以
所以,传输层的「端口号」的作用,是为了区分同一个主机上不同应用程序的数据包。
传输层有两个传输协议分别是 TCP 和 UDP,在内核中是两个完全独立的软件模块。
当主机收到数据包后,可以在 IP 包头的「协议号」字段知道该数据包是 TCP/UDP,所以可以根据这个信息确定送给哪个模块(TCP/UDP)处理,送给 TCP/UDP 模块的报文根据「端口号」确定送给哪个应用程序处理