TCP实现原理和为什么需要三次握手?两次握手不可以?四次握手不可以?
1. 什么是TCP协议?
- TCP:Transmission Control Protocol翻译过来就是传输控制协议,TCP协议是一个面向连接的、可靠的、基于字节流的传输层协议
- RFC 793对TCP连接的定义
> Connections:
> The reliability and flow control mechanisms described above require that TCPs initialize and maintain certain
> status information for each data stream.
> The combination of this information, including sockets, sequence numbers, and window sizes, is called a
> connection.
其大致意思是TCP连接是为了用于保证可靠性和流控制机制的,包括 Socket、序列号及窗口大小。
2. TCP协议的特性
- 面向连接:是指TCP是通过服务端和客户端进行连接的协议
- 面向字节流:TCP服务端和客户端之间的数据通讯是通过字节流数据传输的
- 可靠的:是指TCP服务端客户端之间的数据传输是很稳定的,即使网络很差的情况,TCP都能保证将数据传输到接收方。
3. TCP三次握手执行流程
关键字说明:
SYN:Synchronize Sequence Numbers,同步序列编号
ACK:Acknowledge Character,确认字符
SEQ:Sequence Number,序列号
TCP三次握手执行过程:
- 首先,服务端和客户端都是处于CLOSED状态的,然后服务端启动,监听端口,状态变为LISTEN(监听)状态
- 客户端为了请求资源,发送连接,发送同步序列号SYN,此时客户端就变成了SYN-SEND状态
- 服务端接收到客户端请求之后,发送SYN和ACK,然后服务端状态就变成SYN-RCVD状态
- 客户端接收到信息之后,再次发送ACK,然后变成ESTABLISHED(已确认)状态,服务端接收到返回信息后,状态也变成ESTABLISHED(已确认)状态
TCP协议为什么需要三次握手?
- RFC 793 Transmission Control Protocol里就有指出为什么要三次握手的原因
> The principle reason for the three-way handshake is to prevent old duplicate connection initiations from causing confusion.
> 翻译为中文大致意思是主要原因是为了防止旧的重复连接引起连接混乱问题
设计成三次握手的情况,客户端在接收到服务端SEQ+1的返回消息之后,就会知道这个连接是历史连接,所以会发送报文给服务端,告诉服务端。
TCP设计成三次握手的目的就是为了避免重复连接
设计成四次握手?五次握手?不可以?
可以的,不过为了节省资源,三次握手就可以符合实际情况,所以就没必要设计成四次握手、五次握手等等情况