本文参考:
基础知识
TCP头格式
序列号: 在建立连接时由计算机生成的随机数作为其初始值,通过SYN包发送给接收端主机,每发送一次数据,就「累加」一次该「数据字节数」的大小。用来解决网络包乱序问题。
确认应答号: 指下一次「期望」收到的数据的序列号,发送端收到这个确认应答以后可以认为在这个序号以前的数据都已经被正常接收。用来解决丢包的问题。
控制位:
- ACK:该位为 1 时,确认应答的字段变为有效,TCP 规定除了最初建立连接时的 SYN 包之外该位必须设置为 1 。
- RST:该位为 1 时,表示 TCP 连接中出现异常必须强制断开连接。
- SYN:该位为 1 时,表示希望建立连接,并在其「序列号」的字段进行序列号初始值的设定。
- FIN:该位为 1 时,表示希望断开连接。当通信结束希望断开连接时,通信双方的主机之间就可以相互交换 FIN 位为 1 的 TCP 段。
为什么需要 TCP 协议?
主要原因是IP层是「不可靠」的,不保证网络包的交付、不保证网络包的按序交付、不保证网络包数据中的完整性。
TCP就承担了「可靠传输」的任务,它能确保接收端接收的网络包是无损坏、无间隔、非冗余和按序的。
什么是TCP协议?
TCP 是「面向连接的、可靠的、基于字节流」的传输层通信协议。
- 面向连接:一对一的连接。
- 可靠的:通过复杂的控制机制,它能确保接收端接收的网络包是无损坏、无间隔、非冗余和按序的。
- 字节流:用户消息通过 TCP 协议传输时,消息可能会被操作系统「分组」成多个的 TCP 报文,接收端需要知道「消息的边界」,从而可以组合读取出一个有效的信息。
TCP连接
TCP 四元组可以唯一的确定一个连接,四元组包括如下:
- 源地址
- 源端口号
- 目的地址
- 目的端口号
源地址和目的地址的字段(32位)是在IP头部中,作用是通过 IP 协议发送报文给指定主机。
源端口和目的端口的字段(16位)是在 TCP 头部中,作用是通过TCP 协议把报文发给指定进程。
问题:当一个服务器监听了一个端口,他的TCP连接最大是多少?
服务器有固定的IP地址和固定的端口号,在IPv4中,理论上客户端的IP地址可以达到232
个,端口数量达到216个,因此最大 TCP 连接数可以有248 种可能性。然而这还需要考虑服务端的并发性能限制:
- 文件描述符的限制,Linux在系统级、用户级、进程级上都限制了可打开文件的最大数量。
- 内存限制,每个TCP连接都会占用一定内存,而操作系统的内存是有限的。
UDP和TCP的区别
UDP头部只有8个字节(64位)
目标和源端口:主要是告诉 UDP 协议应该把报文发给哪个进程。
包长度:该字段保存了 UDP 首部的长度跟数据的长度之和。
校验和:校验和是为了提供可靠的 UDP 首部和数据而设计,防止收到在网络传输中受损的 UDP包。
TCP和UDP的区别:
-
连接
TCP 是面向连接的传输层协议,传输数据前先要建立连接。
UDP 是不需要连接,即刻传输数据。 -
服务对象
TCP 是一对一的两点服务,即一条连接只有两个端点。
UDP 支持一对一、一对多、多对多的交互通信。 -
可靠性
TCP 是可靠交付数据的,数据可以无差错、不丢失、不重复、按序到达。
UDP 是尽最大努力交付,不保证可靠交付数据。 -
拥塞控制、流量控制
TCP 有拥塞控制和流量控制机制,保证数据传输的安全性。
UDP 则没有,即使网络非常拥堵了,也不会影响 UDP 的发送速率。 -
首部开销
TCP 首部长度较长,会有一定的开销,首部在没有使用「选项」字段时是 20 个字节,如果使用了「选项」字段则会变长的。
UDP 首部只有 8 个字节,并且是固定不变的,开销较小。 -
传输方式
TCP 是流式传输,没有边界,但保证顺序和可靠。
UDP 是一个包一个包的发送,是有边界的,但可能会丢包和乱序。 -
分片不同*
TCP 的数据大小如果大于 MSS 大小,则会在传输层进行分片,目标主机收到后,也同样在传输层组装 TCP 数据包,如果中途丢失了一个分片,只需要传输丢失的这个分片。
UDP 的数据大小如果大于 MTU 大小,则会在 IP 层进行分片,目标主机收到后,在 IP 层组装完数据,接着再传给传输层。
其中第7点还有一定疑问,需要继续阅读小林计网的基础篇加深理解。
为什么 UDP 头部没有「首部长度」字段,而 TCP 头部有「首部长度」字段呢?
TCP头部有可变长的「选项」字段,而UDP首部长度固定为8字节。
为什么 UDP 头部有「包长度」字段,而 TCP 头部则没有「包长度」字段呢?
TCP负载数据的计算公式为:IP总长度- IP首部长度- TCP首部长度,UDP照理来说也可以这么算,但是估计是为了让首部长度是4字节的整数倍,就把这个字段加上了。
TCP和UDP应用场景
TCP面向连接,并且能保证数据的可靠传输,常用于:
- FTP文件传输
- HTTP/HTTPS
UDP不面向连接,并且简单高效,常用于:
- 包总量较少的通信,如 DNS 、SNMP 等;
- 视频、音频等多媒体通信;
- 广播通信;
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。