HTTP三次握手四次挥手

  • HTTP三次握手四次挥手三次握手
    • 客户端发送报文到服务器,表示客户端想要和服务端建立连接。
    • 服务端接收到客户端请求,返回客户端报文和ack询问客户端是否准备好。
    • 客户端再次相应服务端ack,表示已经准备好。主机收到后检查ack是否正确,正确则建立连接。

HTTP三次握手四次挥手 - 图1

  • 第一次(SYN =1,seq=x):

    客户端发送一个TCP的SYN**标志位置为1的,指明客户端打算连接的服务的端口,以及初始序列号x,保存在包头的序列号seq**字段里

  • 第二次(SYN=1,ACK=1,seq=y,ACKnum=x+1):

    服务端发回确认(ack)包应答。即SYN标志位和ACK标志均为1。服务端选择自己的ISN序列号,放在seq域里,同时将确认号(ack)设置为客户的ISM加1,即x+1。发送完毕后,服务端进入SYN——RCVD状态。

  • 第三次(ACK=1,ACKnum=x+y):

    客户端再次发送确认包(ack),SYN标志位为0,**ACK标志位为1**,并把服务器发来的ACK的序号字段+1,放在确定字段中发送给对方,并在数据段放写ISN的+1。 发送完毕后,客户端进入ESTABLISHED状态,当服务器端收到这个包时,也进入ESTABLISHED状态,TCP握手结束,TCP连接建立完成。

  • 三次握手原因:防止服务器端开启一些无用的连接增加服务器开销以及防止已失效的连接请求报文段突然又传送到了服务端,因而产生错误。


  • 第一次握手:建立连接时,客户端发送syn包(syn=x)到服务器,并进入SYN_SENT状态,等待服务器确认;SYN:同步序列编号(Synchronize Sequence Numbers)。
  • 第二次握手:服务器收到syn包,必须确认客户的SYN(ack=x+1),同时自己也发送一个SYN包(syn=y),即SYN+ACK包,此时服务器进入SYN_RECV状态;
  • 第三次握手:客户端收到服务器的SYN+ACK包,向服务器发送确认包ACK(ack=y+1),此包发送完毕,客户端和服务器进入ESTABLISHED(TCP连接成功)状态,完成三次握手。

为什么要三次?

  • 目的是建立可靠的通信信道。
  • 第一次:客户端什么都不能确认,服务端确认对方发送成功自己接收到了。
  • 第二次:客户端确认自己发送接收正常,对方发送接收正常;服务端确认了对方发送正常自己接收正常。
  • 第三次:客户端确认自己发送接收正常,对方发送接收正常;服务端确认了自己发送接收正常,对方发送接收正常。

    所以三次双方确认都正常。

四次挥手

  • 第一次(FIN=1,seq=x):

    假设客户端想要关闭连接,客户端发送一个FIN标志位置为1的包,表示自己没有数据可发送了,但是仍然可接收数据。发送完毕之后,客户端进入FIN_WAIT_1状态。

  • 第二次(ACK=1,ACKnum=x+1):

    服务端确认客户端的FIN包,发送一个确认包,表面自己接收到了客户端关闭连接的请求,但是还没有准备好关闭连接。发送完毕后,服务器端进入CLOSE_WAIT状态,客户端接收到这个确认包之后进入FIN_WAIT_2状态,等待服务器端关闭连接。

  • 第三次(FIN=1,seq=y):

    服务器准备号关闭连接时,湘客户端发送结束连接请求,FIN置为1。发送完毕后,服务端进入LAST_ACK状态,等待来自客户端的最后一个ACK。

  • 第四次(ACK=1,ACKnum=y+1):

    客户端接收到来自服务器端的关闭请求,发送一个确认包。并进入TIME_WAIT状态,等待可能出现的要重传的ACK包。服务器端接收到这个确认包之后,关闭连接,进入CLOSED状态。 客户端等待了某个固定时间(两个最大段生命周期,2MSL)之后,没有收到服务器端的ACK,认为服务器端已经正常关闭连接,于是自己也关闭连接,进入CLOSED状态。

为什么四次挥手?

  • 任一方都可在传输结束发出释放连接通知,对方确认后进入半关闭状态。当另一方也没有数据发送,则发出释放连接通知,对方确认后就完全关闭TCP连接。

  • 因为当Server端收到Client端的SYN连接请求报文后,可以直接发送SYN+ACK报文。其中ACK报文是用来应答的,SYN报文是用来同步的。但是关闭连接时,当Server端收到FIN报文时,很可能并不会立即关闭SOCKET,所以只能先回复一个ACK报文,告诉Client端,“你发的FIN报文我收到了”。只有等到我Server端所有的报文都发送完了,我才能发送FIN报文,因此不能一起发送。故需要四步握手。

传输可靠性

  • 确认和重传:接收方收到报文就会确认,发送方发送一段时间后没有收到确认就会重传。
  • 数据校验:TCP报文头有校验和,用于校验报文是否损坏。
  • 数据合理分片和排序:TCP会按最大传输单元(MTU)合理分片,接收方会缓存未按序到达的数据,重新排列后交给应用。
  • 流量控制:当接收方来不及处理发送方的数据,能通过滑动窗口,提示发送方降低发送的速率,防止包丢失。
  • 拥塞控制:当网络拥塞时,通过拥塞窗口,减少数据的发送,防止包丢失。

Http 与 Https

  • 简单讲,https = http + ssl 保证安全