TCP传输控制协议
Transmission Control Protocol,简称TCP,Internet传输层协议。提供面向连接,可靠,有序,字节流传输服务。
在进行数据传输时,应用进程需要先建立连接,后续根据TCP协议来进行数据报文的可靠交付。
-
首先客户端跟服务端都是关闭状态,服务端在启动后,进行端口监听,处于LISTEN状态。
-
一次握手: 客户端发送连接请求,SYN=1代表请求服务端建立连接,seq=x表示传输的报文段序列号是x, 客户端状态变为SYN_SENT同步发送状态。
-
二次握手: 服务端在收到请求后,同意建立连接,并且发送确认报文段。
syn=1,同意建立新连接
seq=y, 服务端给返回确认的报文,加上自己的序列号
ack_seq=x+1, 表示已经收到seq=x的报文段,期望后修接收x+1序号的报文
ack=1 确认收到请求报文
发送完后,服务器状态变为SYN_RCVD同步收到。 -
三次握手 客户端对服务器的同意连接报文段进行确认。注意 这次握手可以携带数据。ack=1,seq=x+1,ack_seq=y+1 这个参数就不介绍了。大致跟上面差不多。客户发送ACK报文后,进入ESTABLISHED状态。服务器收到ACK报文后,也进入ESTABLISHED状态。到此连接建立完成。
下面重点来了…
这么解释感觉有点麻烦,也不好记忆。我们可以这样理解三次握手,
TCP不但要建立连接,而且要验证客户端,服务器双方的数据“收发”能力。来我们重新分析下建立连接的过程
- 一次握手: 客户端发送连接请求到服务器,那是不是说明客户端向服务端证明了自己有发送数据的能力,是不是呢。
- 二次握手 服务器收到连接建立请求,返回同意连接报文。客户端在接收到后,是不是说明服务端向客户端证明了自己有接收数据,发送数据的能力,是不是呢?(解释下:确认一次握手的连接请求已接收到)
- 三次握手 客户端再次发送确认报文段给服务器,是不是向服务器证明自己有接收数据的能力,是不是呢?(解释下:确认二次握手的报文数据自己已经接收到。)
- 现在回过头来看呢,第一次,第三次握手验证了客户端的收发。二次握手验证了服务器的收发。
- 然后连接建立完成。
所以呢,三次握手一次都不能少,要不然没法证明呀。