TCP 是面向连接的、可靠的、基于字节流的传输层通信协议。
三次握手相关内容:
三次握手过程

- 第一次握手: 客户端的应用进程主动打开,并向服务器发送请求报文段,其首部中:SYN=1,seq=x,客户端连接状态变为SYN_SENT状态
- 第二次握手:服务器应用进程被动打开。若同意客户端的请求,则发回确认报文,其首部中:SYN=1,ACK=1,ack=x+1,seq=y。服务端连接状态变为SYN_RCVD。
- 第三次握手:客户端收到确认报文之后,通知上层应用进程连接已建立,并向服务器发出确认报文,其首部:ACK=1,ack=y+1。当服务器收到客户端的确认报文之后,也通知其上层应用进程连接已建立。客户端和服务端状态都变为ESTABLISHED状态。
为什么握手三次,两次可以吗?
原因:避免重复连接
其实在RFC 793 Transmission Control Protocol里就有指出为什么要三次握手的原因
The principle reason for the three-way handshake is to prevent old duplicate connection initiations from causing confusion.
翻译为中文大致意思是主要原因是为了防止旧的重复连接引起连接混乱问题
比如在网络环境比较复杂的情况,客户端可能会连续发送多次请求。如果只设计成两次握手的情况,服务端只能一直接收请求,然后返回请求信息,也不知道客户端是否请求成功。这些过期请求的话就会造成网络连接的混乱。
还有一个功能:可以探测客户端和服务端的收发功能。第一次握手时,对于服务器端而言,能够证明客户端发送功能正常。第二次握手时,对于客户端而言能够证明服务端收发功能都正常,但服务端不知道客户端的收是否正常。第三次握手后,服务端知道了客户端收莫得问题。
三次握手时都同步了哪些东西?
-
同步双方初始序列号。序列号是TCP协议的可靠性机制的手段。按照序列号可以保证连接上数据的有序性以及确认可达性。
-
windows size 窗口大小。 客户端和服务端都会发送各自的windows size,最终协商出二者最小值,这是TCP流控的所需要的。
-
MSS。 TCP连接的对端发往本端的最大TCP报文段的长度。握手成功后,数据传输时,数据部分(不包括TCP头)的长度不能超过协商的TCP-MSS,否则会进行分片。
MSS是什么,作用是什么?
MSS(Maximum Segment Size)是TCP协议中的一个参数,表示在一个TCP报文段中所能承载的最大数据量。
MSS的作用:
-
数据分段:在TCP传输过程中,数据会被分成多个报文段进行传输。MSS决定了每个报文段能够携带的最大数据量。发送方根据MSS将数据进行分段,并在接收方重新组装这些分段。
-
避免IP层分片:如果一个TCP报文段的长度超过了网络链路上某一设备(如路由器)所支持的最大传输单元(MTU),则该报文段需要被IP层进行分片处理。而分片会增加网络开销和延迟。通过设置合适的MSS值,可以避免IP层对TCP报文段进行分片。
-
拥塞控制:TCP拥塞控制算法使用MSS来估计网络链路上的可用带宽。当发送方发现丢包时,会降低拥塞窗口大小,并根据MSS来计算新的拥塞窗口大小。
TCP连接建立过程:在三次握手过程中,双方会交换各自支持的MSS值,并选择较小的那个作为双方共同使用的MSS值。这样可以确保在整个连接过程中,双方都能够使用相同的MSS值。
mss和mtu的区别
MSS(Maximum Segment Size)和MTU(Maximum Transmission Unit)是两个与数据传输相关的参数,它们在TCP/IP协议中有不同的作用。
MSS(最大报文段长度):是TCP协议中的一个参数,表示在一个TCP报文段中所能承载的最大数据量。MSS是应用层与传输层之间的参数,它决定了每个TCP报文段的大小。MSS值主要用于分段、拥塞控制和连接建立过程。
MTU(最大传输单元):是网络层(如IP协议)中的一个参数,表示在网络链路上能够承载的最大数据包大小。MTU是网络层与数据链路层之间的参数,它决定了通过网络链路传输的数据包大小。MTU值主要用于避免IP层分片和确定数据链路层帧的大小。
区别:
MSS位于传输层,而MTU位于网络层。
MSS决定了TCP报文段的大小,而MTU决定了IP数据包或数据链路帧的大小。
MSS通常小于等于MTU。MSS值不能超过所经过路径上所有设备支持的最小MTU值。
MSS在TCP连接建立时进行交换,并选择双方共同支持的较小值作为实际使用值;而MTU由各个设备配置或自动发现,并在网络链路上保持一致。
MSS主要用于分段、拥塞控制和连接建立过程;MTU主要用于避免IP层分片和确定数据链路层帧的大小。
TCP和UDP对比
TCP 和 UDP 区别:
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 层组装完数据,接着再传给传输层,但是如果中途丢了一个分片,则就需要重传所有的数据包,这样传输效率非常差,所以通常 UDP 的报文应该小于 MTU。
TCP 和 UDP 应用场景:
由于 TCP 是面向连接,能保证数据的可靠性交付,因此经常用于:
FTP 文件传输
HTTP / HTTPS
由于 UDP 面向无连接,它可以随时发送数据,再加上UDP本身的处理既简单又高效,因此经常用于:
包总量较少的通信,如 DNS 、SNMP 等
视频、音频等多媒体通信
广播通信