什么是tcp协议?
操作系统之间的通信,是需要一种规则的.而我们就将这种规则称为协议,TCP/IP 是互联网相关各类协议族的总称。TCP协议是一种面向连接的、可靠的、基于字节流的运输层通信协议。TCP/IP协议族按层次可分为应用层,传输层,网络层,数据链路层,物理层。
tcp有一个重要的概念,TCP的三次握手,什么是三次握手呢?
第一次握手:客户端发送连接请求报文段到服务端,服务端收到消息之后,判断自己是否可以与客户端进行连接
第二次握手:服务端收到客户端的 SYN 报文段,进行判断了之后需要把是否允许客户端进行连接的结果反馈给客户端,当客户端收到了可以成功连接的消息之后,便是第二次握手成功。客户端只有确定了自己能与服务端连接上才能开始发数据
第三次握手:客户端收到服务端的确认消息之后,需要再次向服务端发送确认消息,此时服务端在收到客户端的确认消息之后,便可以建立tcp连接进行通讯了。
大部分同学就认为既然两次握手已将可以开始传输数据了,那么为什么还要进行第三次握手呢,那么接下来我们就来讲讲为什么需要三次握手?
其实网络之间的传输并不是想象的那样一帆风顺,客户端发送请求,服务端就能及时收到。比如现在有一个从客户端过来的请求,
在某个网络结点长时间的滞留了,但是并没有丢失的情况下,以致延误到连接释放以后的某个时间才到达服务端,这时候客户端便认为这是一个失效的报文段。但是服务端却不这样认为,服务端认为这是客户端刚发起的一个请求,便向客户端发出确认报文段,同意建立连接。这时候如果没有第三次握手,便会造成服务端一直等待客户端发送请求数据,但是客户端已经舍弃了本次请求,因此服务起便会一直等待,从而造成服务区资源的浪费。这样的请求一多,自然而然造成服务器的崩溃。
因此,为了防止已失效的连接请求报文段突然又传送到了服务端,因而产生错误,所以建立tcp连接时需要第三次握手。
那么连接创建了,又怎么中断链接呢?这是时候又要引出tcp协议的另外一个概念,四次挥手。
双方建立了链接一方出问题了怎么办呢?
对于这种情况,双方已经建立连接,但是服务端一直等待接收,客户端出现问题一直不能发送请求数据。因此tcp协议设计一个保活的计时器,如果一方出现问题,另一方过了这个计时器的时间,就发送试探报文,以后每隔 75 秒发送一次。若一连发送10个探测报文仍然没反应,服务器就认为客户端出了故障,接着就关闭连接。
那么什么是四次挥手呢?
第一次挥手:客户端向服务端发送一个FIN报文,并进入FIN_WAIT_1状态,表示 Client 没有数据要发送给 Server了,客户端在第一次挥手后便不能再向服务端发送数据了。
第二次挥手:服务器收到客户端的FIN报文之后,向客户端回一个ACK报文的确认消息,告诉客户端----服务端已经同意了关闭连接的请求,此时客户端进入 FIN_WAIT_2 状态。Server 第一次响应后,还可以继续向 Client 发送数据,并没有真正的关闭请求。
第三次挥手:紧接着服务端挥再次向客户端发送 FIN 报文,请求关闭连接,告诉再客户端,服务端可以关闭请求了,同时服务端进入 CLOSE_WAIT 状态.此时服务端也会终止向客户端发送数据。
第四次挥手:客户端在收到服务端发送的 FIN 报文段后,会向服务端发送ACK报文,然后进入TIME_WAIT 状态,等待服务端收到这个ACK报文之后,便会关闭连接,等待超过2MSL后依然没有收到回复,则证明服务端已正常关闭,紧接着客户端就可以关闭连接了。
那么为什么要进行四次挥手呢?
TCP是全双工模式,中断连接必须要服务端与客户端双方都确认都终止才行,不能单方面终止其中一方,根据四次挥手的过程来看便能够很容易理解了。
那为什么需要等待两个2MSL呢?
客户端给服务端发送的ACK = 1丢失,服务端等待 1MSL没收到,然后重新发送消息需要1MSL。如果再次接收到服务端的消息,则重启2MSL计时器,发送确认请求。客户端只需等待2MSL,如果没有再次收到服务端的消息,就说明服务端已经接收到自己确认消息;此时双方都关闭的连接,TCP 四次分手完毕。