计算机网络—TCP协议 3.24

TCP协议

TCP(Transmission Control Protocol)传输控制协议,是一种面向连接的,可靠的,全双工基于字节流的传输层通信协议。是主机对主机层的传输控制协议。

1.三次握手

位码即tcp标志位,有6中标示:

SYN (synchronous) 建立联机

ACK(acknowledgement) 确认

PSH(push) 传送

FIN(Finish) 结束

RST(reset) 重置

URG(urgent) 紧急

Sequence number 顺序号码

Acknoeledge number 确认号码

主机A为客户端 主机B为服务器

第一次握手

  主机A发送位码SYN=1,随机产生 seq number=x的数据包到服务器,进入SYN_SEND状态,等待服务器确认。

第二次握手:
    主机B收到请求,由SYN=1知道,A要求建立联机。向A发送ack number(x+1),SYN=1,ACK=1,随机产生seq=y的包(上述为SYN+ACK包),主机B进入SYN_RECV状态。

第三次握手:
  主机A收到后,检查acknumber是否正确,ACK是否为1。若正确,主机A发送

ack number=(y+1),ACK=1,自己的序号为seq=x+1主机B收到后检查seq值与ack=1建立成功,双方进入ESTABLISHED状态。

三次握手完成

2.四次挥手

第一次挥手:
 客户端发送一个FIN,用来关闭客户端到服务器的数据传送,客户端进入FIN_WAIT_1状态。

第二次挥手                                
  服务器收到FIN后,发送一个ACK,确认序号为收到的序号+1,服务器进入CLOSE_WAIT状态

第三次挥手:
  服务器发送一个FIN,用来关闭server到client的数据传送,服务器进入LAST_ACK状态

第四次挥手:
    client收到FIN后,client进入TIME_WAIT状态,接着发送一个ACK给server,确认序号为收到序号+1,server进入CLOSED状态,完成四次挥手。

各种状态

CLOSED:表示初始状态。 
LISTEN:表示服务器端的某个SOCKET处于监听状态,可以接受连接了。 
SYN_RECV:
这个状态表示接受到了SYN报文,在正常情况下,这个状态是服务器端的SOCKET在建立TCP连接时的三次握手会话过程中的一个中间状态,很短暂,基本上用netstat你是很难看到这种状态的,当收到客户端的ACK报文后,它会进入到ESTABLISHED状态。 
SYN_SENT:
这个状态与SYN_RECV遥想呼应,当客户端SOCKET执行CONNECT连接时,它首先发送SYN报文,因此也随即它会进入到了SYN_SENT态,并等待服务端的发送三次握手中的第2个报文。SYN_SENT状态表示客户端已发送SYN报文。 
ESTABLISHED
:表示连接已经建立了。

FIN_WAIT_1:表示等待对方的FIN报文。当SOCKETESTABLISHED状态时,它想主动关闭连接,向对方发送了FIN报文,此时该SOCKET进入到FIN_WAIT_1状态。而当对方回应ACK报文后,则进入到FIN_WAIT_2状态,当然在实际的正常情况下,无论对方何种情况下,都应该马上回应ACK报文,所以FIN_WAIT_1状态一般是比较难见到的,而FIN_WAIT_2状态还有时常常可以用netstat看到。 
FIN_WAIT_2
FIN_WAIT_2状态下的SOCKET,表示半连接,也即有一方要求close连接,但另外还告诉对方,我暂时还有点数据需要传送给你,稍后再关闭连接。 
TIME_WAIT:
表示收到了对方的FIN报文,并发送出了ACK报文,就等2MSL后即可回到CLOSED可用状态了。如果FIN_WAIT_1状态下,收到了对方同时带 FIN标志和ACK标志的报文时,可以直接进入到TIME_WAIT状态,而无须经过FIN_WAIT_2状态。 
CLOSING:
这种状态比较特殊,实际情况中应该是很少见,属于一种比较罕见的例外状态。正常情况下,当你发送FIN报文后,按理来说是应该先收到(或同时收到)对方的 ACK报文,再收到对方的FIN报文。但是CLOSING状态表示你发送FIN报文后,并没有收到对方的ACK报文,反而却也收到了对方的FIN报文。什么情况下会出现此种情况呢?其实细想一下,也不难得出结论:那就是如果双方几乎在同时close一个SOCKET的话,那么就出现了双方同时发送FIN文的情况,也即会出现CLOSING状态,表示双方都正在关闭SOCKET连接。 
CLOSE_WAIT:
表示在等待关闭。当对方close一个SOCKET后发送FIN报文给自己,你系统毫无疑问地会回应一个ACK报文给对方,此时则进入到CLOSE_WAIT状态。接下来呢,实际上你真正需要考虑的事情是察看你是否还有数据发送给对方,如果没有的话,那么你也就可以 close这个SOCKET,发送FIN报文给对方,也即关闭连接。所以你在CLOSE_WAIT状态下,需要完成的事情是等待你去关闭连接。 
LAST_ACK:
被动关闭一方在发送FIN报文后,最后等待对方的ACK报文。当收到ACK报文后,也即可以进入到CLOSED可用状态了。

猜你喜欢

转载自blog.csdn.net/weixin_41661222/article/details/79808992