zoukankan      html  css  js  c++  java
  • TCP的三次握手四次挥手

    tip:以下都假设客户端是主动方,服务器为被动方。实际情况两者即可能是主动也可能是被动。

    TCP(传输控制协议)是作用在传输层的面向连接的传输协议。大多数网页和在线视频都是用的TCP协议。

    【问题】什么是“三次握手,四次挥手”?
    TCPIP协议给两台设备建立连接要经历三次通信,断开的时候要经历四次通信,这就是”三次握手和四次挥手“。

    一. TCP报文
    TCP层传输的数据是以报文的形式呈现的,而握手挥手的过程就要用到几个报文里的参数。
    TCP报文

    • 序列号Seq:发送数据时携带的随机标识

    • 确认号Ack:收到数据后,回复发送端的标识,Ack的值一般是Seq号+1之类的形式构成,便于发送端识别连接已确认

    • 标识位:定义此次通信的行为是什么
      SYN:发起一个新连接,SYN=1表示发起一个新连接
      ACK:确认号是否有效,ACK=1表示确认号有效,ACK=0表示报文不含确认号信息
      FIN:结束标志,用于释放连接,FIN=1表示关闭本方数据流


    二. ”三次握手“
    建立连接的三次握手如下图:
    三次握手
    seq都为系统取得随机数,这里以字母表示。
    过程解析 :

    • 第一次握手:客户端发送连接请求SYN=1,seq=J
    • 第二次握手:服务器收到连接请求所以回复ACK=1,ack=J+1;同时服务器也向客户端发起连接请求SYN=1,seq=K。
    • 第三次握手:客户端收到ACK=1,ack=J+1知道自己的连接成功,并处理了服务器的连接请求SYN=1,seq=K,发送ACK=1,ack=K+1

    然后客户端和服务端相互间就建立了连接,完成了TCP三次握手。

    【问题】为什么是三次握手而不是两次?
    因为客户端服务端双方都要建立连接,如果只有两次的话,服务端就不会能确认它是否连接上了客户端。


    三. ” 四次挥手“

    四次挥手

    过程解析:

    • 第一次挥手:客户端发起释放连接请求FIN=1,seq=m
    • 第二次挥手:服务器收到请求,回复ACK=1,ack=m+1。客户端收到后为半关闭状态
    • 第三次挥手:服务器再发送自己这次被动释放连接的请求FIN=1,ACK=1,ACK=m+1,seq=n
    • 第四次挥手:客户端收到释放连接请求,确认请求发送ACK=1ack=n+1。服务端收到后释放连接,经过
      2MSL(报文最大生命周期)后客户端也释放连接。

    【问题】为什么是四次挥手,而不是两次三次?

    客户端因为发送完数据后才开启的释放连接请求,服务器收到后,回复客户端它收到了,但是这时服务器不一定就发完了它的数据,所以客户端要等待服务器发送完数据,服务器再发送释放连接请求,客户端回应后服务器就释放连接了。所以四次挥手是为了被动放传完数据再释放连接。

    【问题】为什么最后客户端要等待2MSL后再关闭?
    因为客户端担心最后一条报文服务器没有收到,所以要等一段时间后再自己放释放。如果服务器没有收到客户端最后一条ACK报文,会再发送一次FIN请求释放连接报文。


    参考:https://www.cnblogs.com/jainszhang/p/10641728.html

  • 相关阅读:
    MSDTC服务出错
    jquery.lazyload.js实现图片延迟加载——wordpress图片随滚动条渐显效果
    js:警惕firstChild
    基于jquery的表格排序
    jquery JSON的解析方式
    用JS jquery取float型小数点后两位
    JQuery之append和appendTo的区别,还有js中的appendChild用法
    js笔记之Math random()、ceil()、floor()、round()
    Oracle笔记
    STL: equal
  • 原文地址:https://www.cnblogs.com/ningzijie/p/12664150.html
Copyright © 2011-2022 走看看