部分内容来源:小林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 模块的报文根据「端口号」确定送给哪个应用程序处理