本文详细讲解了建立TCP连接的过程,为什么TCP建立连接是经过三次握手和四次挥手,而不是两次或者四次握手。以及对HTTP连接和Socket连接的一些概念介绍。
TCP三次握手与四次挥手
首先对TCP连接过程中几个专有名词进行介绍:
- SYN(Synchronize Sequence Numbers),同步标志,表示建立连接
- ACK(Acknowledgemnet Number),确认标志,表示响应
- PSH,表示有DATA数据传输
- RST,复位标志,表示连接重置
- FIN,结束标志
整个TCP连接过程如下图所示:
TCP连接建立过程中的三次握手
整个tcp建立连接三次握手如下图所示:
第一次握手:主机A发送位码为syn=1,随机产生seq number=1234567的数据包到服务器,主机B由SYN=1知道,A要求建立联机;
第二次握手:主机B收到请求后要确认联机信息,向A发送ack number=(主机A的seq+1),syn=1,ack=1,随机产生seq=7654321的包;
第三次握手:主机A收到后检查ack number是否正确,即第一次发送的seq number+1,以及位码ack是否为1,若正确,主机A会再发送ack number=(主机B的seq+1),ack=1,主机B收到后确认seq值与ack=1则连接建立成功。
TCP连接断开过程中的四次挥手
假设Client端发起中断连接请求,也就是发送FIN报文。Server端接到FIN报文后,意思是说我Client端没有数据要发给你了,但是如果你还有数据没有发送完成,则不必急着关闭Socket,可以继续发送数据。所以你先发送ACK,告诉Client端,你的请求我收到了,但是我还没准备好,请继续你等我的消息。这个时候Client端就进入FINWAIT状态,继续等待Server端的FIN报文。当Server端确定数据已发送完成,则向Client端发送FIN报文,告诉Client端,好了,我这边数据发完了,准备好关闭连接了。Client端收到FIN报文后,就知道可以关闭连接了,但是他还是不相信网络,怕Server端不知道要关闭,所以发送ACK后进入TIMEWAIT状态,如果Server端没有收到ACK则可以重传。Server端收到ACK后,就知道可以断开连接了。Client端等待了2MSL后依然没有收到回复,则证明Server端已正常关闭,那好,我Client端也可以关闭连接了。Ok,TCP连接就这样关闭了。
中断连接端可以是Client端,也可以是Server端。
为什么TCP是三次握手建立连接而不是两次或四次
如上图所示,两次握手无法保证双方都可以接收到消息,而三次以上又多余了。
HTTP连接
HTTP是建立在TCP之上的应用层协议(具体分层细则可以参考:TCP/IP协议族介绍),HTTP连接最显著的特点是客户端发送的每次请求都需要服务器回送响应,在请求结束后,会主动释放连接。从建立连接到关闭连接的过程称为“一次连接”。
- 在HTTP 1.0中,客户端的每次请求都要求建立一次单独的连接,在处理完本次请求后,就自动释放连接。
- 在HTTP 1.1中则可以在一次连接中处理多个请求,并且多个请求可以重叠进行,不需要等待一个请求结束后再发送下一个请求。
Socket连接
Socket是应用层与传输层之间的一个抽象层,它是一套接口,所以Socket连接可以基于TCP连接,也有可能基于UDP。
建立网络通信连接至少要一对端口号(socket)。
Socket 是对 TCP/IP 协议族的一种封装,是应用层与TCP/IP协议族通信的中间软件抽象层。从设计模式的角度看来,Socket其实就是一个门面模式,它把复杂的TCP/IP协议族隐藏在Socket接口后面,对用户来说,一组简单的接口就是全部,让Socket去组织数据,以符合指定的协议。
相关文章