基本认识
报文格式
序列号:连接时用随机值作为初始值,通过SYN包传给接收端,发送一次数据,累加一次数据字节的大小。用来解决网络包乱序问题。
确认应答号:下一次期望收到数据的序列号,发送端收到应答号认为这个序号以前的数据已经被正常接收。用来解决不丢包问题。
控制位:
- ACK: 该位为1时,确认应答字段变为有效。
- RST: 该位为1时,TCP连接出现异常必须强制断开连接。
- SYN: 该位为1时,表示希望建立连接。
- FIN:该位为1时,表示希望断开连接。
常见问题
- 为什么需要TCP协议?
IP层的不可靠,不保证网络包的交付与完整性。需要保证网络数据包的可靠性,就需要由上层的TCP协议来负责。TCP是一个工作在传输层的可靠数据传输,能确保接收端接收的网络包是无损坏、无间隔、非冗余和按序的。
-
什么是TCP?
面向连接的、可靠的、基于字节流的传输层通信协议。
面向连接:一对一连接。一对多无法做到。
可靠的:无论网络链路怎样变化,TCP都可以保证一个报文一定能够到达接收端。
字节流:消息没有边界,无论消息多大都可以传输;消息有序;重复报文自动丢弃。
-
什么是TCP连接?
用于保证可靠性和流量控制维护的某些状态信息,这些信息的组合,包括Socket、序列号和窗口的大小称为连接。
建立一个TCP连接需要客户端与服务器端达成以上三个共识。
socket:由IP地址和端口号组成。
序列号:用来解决乱序问题。
窗口大小:用来做流量控制。
-
如何确定一个TCP连接?
四元组:
源地址
源端口
目的地址
目的端口
其中,源地址和目的地址字段(32位)在IP头部,作用是通过IP协议发送报文给对方主机。
源端口和目的端口字段(16位)是在TCP的头部中,作用是告诉TCP协议应该把报文发送给哪个进程。
-
TCP的最大连接数是多少?
最大TCP连接数 = 客户端的IP数 * 客户端的端口数
服务端的最大并发TCP连接数远远不能达到理论上限。原因:
文件描述符限制,socket都是文件,需要通过ulimit配置文件描述符的数目;内存限制,每个TCP连接都要占用一定内存,操作系统的内存是优先的。
-
UDP和TCP的区别?应用场景?
UDP不提供复杂的控制机制,利用IP提供面向无连接的通信服务。
UDP 协议简单,头部只有8个字节(64位),UDP头部格式如下:
源端口(16位) 目标端口(16位)
包长度 (16位) 校验和(16位)
数据
区别:
- 连接
- TCP是面向连接的传输层协议,传输数据前先要建立连接
- UDP是不需要连接,即刻传输数据
- 服务对象
- TCP 是一对一的两点连接。
- UDP支持一对一、一对多、多对多的通信。
- 可靠性
- TCP的可靠交付数据,数据可以无差错、不重复、不丢失、按时到达。
- UDP是尽最大努力交付,不保证可靠交付数据。
- 拥塞控制、流量控制
- TCP有拥塞控制和流量控制机制,保证数据传输安全性。
- UDP没有。
- 首部开销
- TCP头部较长,至少20个字节。
- UDP头部8个字节,固定不变。
- 传输方式
- TCP流式传输。没有边界,保证顺序可靠。
- UDP一个包接一个包发送,有边界,会丢包和乱序。
- 分片不同
- TCP数据大小大于MSS大小,会在传输层进行分片,目标主机收到后,会在传输层组装TCP数据包,如果中途丢失一个分片,只需要传输丢失的这个分片。
- UDP的数据大小如果大于MTU的大小,会在IP层进行分片,目标主机收到后,在IP层组装完成数据,接着再传给传输层,中途丢失一个分片,在实现可靠传输的UDP时需要重传所有的数据包,传输效率很差,所以UDP的报文应该小于MTU。
应用场景:
TCP面向连接,能保证数据的可靠性交付,常用于:- FTP文件传输
- HTTP/HTTPS
UDP面向无连接,可以随时发送数据,常用于:
- 包总量较少的通信,如DNS、SNMP等
- 视频、音频等多媒体通信
- 广播通信
- 连接
-
为什么UDP头部没有首部长度字段,而TCP有?
TCP头部有可变长的选项字段,头部长度会有所变化,UDP头部长度不会变化,不需要额外记录。
-
为什么UDP头部有包长度字段,而TCP头部没有包长度字段?
TCP数据的长度 = IP总长度 - IP首部长度 - TCP首部长度
IP的两种长度在首部格式都是已知的。TCP首部长度在TCP首部格式中是已知的。
UDP同理,但是首部长度需要是4字节的整数倍,UDP需要首部长度。
推荐一个零声学院免费公开课程,个人觉得老师讲得不错,分享给大家:Linux,Nginx,ZeroMQ,MySQL,Redis,fastdfs,MongoDB,ZK,流媒体,CDN,P2P,K8S,Docker,TCP/IP,协程,DPDK等技术内容,立即学习