TCP(Transmission Control Protocol传输控制协议)是一种面向连接的(端对端,不能1对多)、可靠的、基于字节流的传输层通信协议。
TCP首部:20B
TCP的六个标志位:
PSH:当PSH=1的时候,会立刻封装发送出去;
RST:复位比特,表示需要重新建立连接;
SYN:同步比特,当SYN = 1的时候,向对方请求建立一个链接,主要用于TCP三次握手,建立连接;
FIN:当FIN = 1时,请求终止TCP链接;
URG:紧急字段;
ACK:确认字段,对方返回确认ACK = 1。
以上6个标志位往往和首部其他字段配合使用。
接下来就步入正题。
TCP三次握手
所谓三次握手是指建立一个TCP连接时,需要客户端和服务器总共发送3个包。
三次握手的目的是连接服务器指定端口,建立TCP连接,并同步连接双方的序列号和确认号并交换TCP窗口大小信息。
当建立未开始的时候,C和S都处于CLOSED的状态,接着S进入LISTEN状态,监听客户端是否发送请求。
第一次握手,客户端发送SYN=1,Seq=X,表示客户端请求建立连接,并将初始序列号X发送给服务器,客户端进入SYN_SENT状态。
第二次握手,服务器端返回SYN=1,Seq=Y,ACK=1,ack=X+1,表示服务器端请求和客户端建立连接,将初始序列号Y发送给客户端;ACK=1是对客户端请求建立连接的确认,ack = X+1是返回给客户端的序列号(将客户端的Seq=X加1)。此时,服务器端进入SYN_RCVD状态。
第三次握手,客户端发送Seq=X+1,ACK=1,ack=Y+1,表示客户端确认连接,再次发送序列号X+1,并返回Y+1;客户端进入ESTABLISHED状态。当服务器端收到后,服务器端也进入ESTABLISHED状态。
那么为什么是三次握手呢?
三次就可以确认双方都能正常接发消息。这就和打电话的道理是一样的,Ex:
“喂?你听的到吗?”
“我听的到,你听的到我吗?”
“我能听得到你,今天……”
如果是两次的话,可能会出现这种情况:
“喂?你听的到吗?”
“我听的到”
“喂?你听的到吗?”
“我听的到”
如果是四次呢?
“喂?你听的到吗?”
“我听的到,你听的到我吗?”
“我能听得到你,你能听的到我吗?”
“我不想和xx说话”
TCP四次挥手
目的是拆除连接,而拆除连接需要发送4个包。客户端和服务器均可主动发起挥手动作。
第一次挥手,客户端发完数据后,向服务端发送FIN=1,序列号为X,表示客户端没有数据要发送给服务器了,客户端进入FIN_WAIT_1状态。
第二次挥手,服务器受到了客户端的FIN报文段,向客户端发送一个ACK=X+1确认,表示“我同意你关闭”,接着客户端进入FIN_WAIT_2状态。
第三次挥手,服务器向客户端发送FIN报文段,请求关闭连接,服务器进入LAST_ACK状态。
第四次挥手,客户端收到服务器的FIN报文,返回ACK确认,客户端进入TIME_WAIT状态,服务器收到ACK关闭连接,此时客户端等待2MSL之后没有收到回复,证明服务器正常关闭,然后客户端关闭连接。
前两次,客户端关闭写通道,不再发送数据,但可以接收数据;服务器端关闭读通道,仍可发送数据。后两次,客户端关闭读通道,服务器关闭写通道。可见,通过四次双方成功关闭读写通道——关闭连接。
四次挥手还有双方同时请求断开连接的情况。感兴趣的可以去查阅一下。