建立TCP连接
我们知道了TCP/IP协议簇大致的工作原理之后,我们来看看HTTP是如何建立连接的。
1.TCP包头信息
前面咱们讲过HTTP是一个基于TCP/IP协议簇来传递数据,所以这HTTP建立连接也就是建立TCP连接,TCP如何建立连接,一起来看看TCP包信息结构吧。
TCP报文包=TCP头信息+TCP数据体,而在TCP头信息中包含了6种控制位(上图红色框中),这六种标志位就代表着TCP连接的状态:
-
URG:
紧急数据(urgent data)—-这是一条紧急信息
-
ACK:
确认已收到
-
PSH:
提示接收端应用程序应该立即从tcp接收缓冲区中读走数据
-
RST:
表示要求对方重新建立连接
-
SYN:
表示请求建立一个连接
-
FIN:
表示通知对方本端要关闭连接
2.建立连接过程
了解了TCP包头信息之后,我们就可以正式看看TCP建立连接的三次握手了。
三次握手讲解:
-
客户端发送位码为syn=1,随机产生seq number=1234567的数据包到服务器,服务器由SYN=1知道客户端要求建立联机(客户端:
我要连接你)
-
服务器收到请求后要确认联机信息,向A发送ack number=(客户端的seq+1),syn=1,ack=1,随机产生seq=7654321的包(服务器:
好的,你来连吧)
-
客户端收到后检查ack number是否正确,即第一次发送的seq number+1,以及位码ack是否为1,若正确,客户端会再发送ack number=(服务器的seq+1),ack=1,服务器收到后确认seq值与ack=1则连接建立成功。
(客户端:
好的,我来了)
面试官:为什么http建立连接需要三次握手,不是两次或四次
答:三次是最少的安全次数,两次不安全,四次浪费资源
3.断开连接过程
在建立TCP连接时是三次握手,而断开TCP连接是四次挥手!
TCP关闭连接过程:
1.Client向Server发送FIN包,表示Client主动要关闭连接,然后进入FIN_WAIT_1状态,等待Server返回ACK包。此后Client不能再向Server发送数据,但能读取数据。
2.Server收到FIN包后向Client发送ACK包,然后进入CLOSE_WAIT状态,此后Server不能再读取数据,但可以继续向Client发送数据。
3.Client收到Server返回的ACK包后进入FIN_WAIT_2状态,等待Server发送FIN包。
4.Server完成数据的发送后,将FIN包发送给Client,然后进入LAST_ACK状态,等待Client返回ACK包,此后Server既不能读取数据,也不能发送数据。
5.Client收到FIN包后向Server发送ACK包,然后进入TIME_WAIT状态,接着等待足够长的时间(2MSL)以确保Server接收到ACK包,最后回到CLOSED状态,释放网络资源。
6.Server收到Client返回的ACK包后便回到CLOSED状态,释放网络资源。