TCP(Transmission Control Protocol)传输控制协议,是一个传输层协议。
它是面向连接的、可靠的、基于IP的协议;接受端在收到发送端发送的信号后会回复一个确认信息,发送端收到这个确认信息后才会继续发送数据。
一、TCP三次握手
TCP是一个面向连接的协议,两个主机在互相发送数据之前必须先建立连接。
建立连接就是确保双方的网络是通畅的,双方可以进行通信。
TCP三次握手建立连接具体过程:
(1)TCP服务器进程先创建传输控制块TCB,时刻准备接受客户进程的连接请求,此时服务器进入了LISTEN(监听状态)。
#在这里,发送数据的那一端是客户端,接收数据的那一段是服务端。
(2)TCP客户进程也是先创建传输控制块TCB,然后向服务器发出连接请求报文,这时报文首部中的SYN=1,同时选择一个序列号seq=x(该数是个随机值),此时TCP客户端进程进入了SYN_SEND(同步已发送状态)。
#TCP规定,SYN报文段不能携带数据,但需要消耗一个序列号。
(3)TCP服务器收到请求报文后,如果同意连接,则发出确认报文,确认报文中ACK=1,SYN=1,确认号ack=x+1,自己也要有一个初始的序列号seq=y,此时TCP服务进程进入SYN_RCVD(同步收到)状态。这个SYN报文也不能携带数据,但是要消耗一个序列号。
(4)TCP客户端收到确认后,还要向服务器给出确认,确认报文的ACK=1,ack=y+1,自己的序列号seq=x+1,此时TCP建立连接,客户端进入ESTABLISHED(已建立连接)状态。
#TCP规定,ACK报文段可以携带数据,但是如果不携带数据则不消耗序号。
(5)当服务器收到客户端确认后也进入已建立连接状态,双方就可以开始通信了。
报文相关
seq序号:占32位,用来标识从发送端到接收端的数据的。
ack序号:确认序号,占32位,只有当ACK标识为1时,该序号才有效。是对发送方发送的数据的确认。
TCP的六个标志位:
SYN是握手的数据包,建立连接;
ACK是确认数据包,回应标识;
FIN是断开连接的数据包;
PSH表示数据包;
RST重置(重传) 网络不稳定时会看到许多;
URG是紧急指针。
二、TCP四次挥手
TCP四次握手终止连接。
你是不是有大大的疑惑:为什么建立连接三次握手就够了,断开连接时就需要四次连接?
这是因为,当客户端发送完数据的时候会向服务端发送一个FIN报文,而这个报文仅仅只能表示,我客户端这边数据发送完了,我不会再发送数据了,但是服务端可能还没有将数据发送完,所以就需要增加一次挥手,当服务端的数据也发送完成的时候,也会向客户端发送一个FIN报文。这样就确保了双方的数据都发送完毕并且没有丢失。
TCP四次挥手断开连接具体过程:
(1)客户端向服务端发送一个FIN报文,客户端进入FIN_WAIT_1状态。
(2)服务端收到客户端的FIN报文后,会回复一个确认信息,并继续发送没有发送完的数据,此时服务端进入CLOSE_WAIT状态。
(3)服务端也已将数据发送完毕,便向客户端发送一个FIN报文,服务端进入LAST_ACK状态。
(4)客户端收到服务端的FIN报文之后,进入Client_WAIT状态,接着发送一个ACK报文给服务端,服务端进入CLOSED状态。
大家可以参照上图观察序号的变化(只看序号变化即可,不要关注值),此处便不再赘述。