zoukankan      html  css  js  c++  java
  • 大白话讲解TCP三次握手

    为什么需要三次握手?
    三次握手的目的是为了确保客户端和服务端建立稳定可靠的连接。

    在讲解之前,需要先明白[SYN]和[ACK]是什么意思?
    [SYN]和[ACK]是命令标记。
    在客户端和服务端建立连接之前,双方需要互发消息,确认是否可以建立连接。而发送消息的命令就是用[SYN]和[ACK]来标记的。
    如果命令是[SYN],表示发送的是数据包的编号;如果命令是[ACK],表示的是确认信息。
    SYN:Synchronize Sequence Numbers,同步序列编号,即每个数据包的编号,使用Seq表示,第一次时随机产生。
    客户端每发送一条消息,编号自动+1。比如第一次发送时编号为1001,那么第二次为1002,第三次为1003,以此类推。服务端同样如此。
    ACK:Acknowledge,确认信息(对方的Seq+1)。

    大白话描述TCP三次握手:
    1.客户端发消息给服务端,请求建立连接。->[SYN]
    2.服务端收到客户端消息后,通过某种机制,确认客户端没问题。但是,此时此刻,客户端还不知道自己想要建立请求的服务端有无问题。需要服务端发送消息给客户端,等待客户端确认。所以服务端就把自己已经确认的信息 + 需要客户端确认的消息发送给客户端。->[ACK,SYN]
    3.客户端收到服务端消息后,通过某种机制,确认服务端没问题。然后客户端把自己已经确认的消息发给服务端,告诉服务端我这边确认过了,你没问题,可以连接了。服务端收到后,对确认信息进行核实,如果没问题,连接正式建立。->[ACK]

    下面通过分析[SYN]和[ACK]命令来详细了解三次握手

    第一次
    192.168.3.222 TCP 192.168.3.230 52360 → 9501 [SYN] Seq=0
    客户端向服务端发送[SYN]命令,客户端包的编号Seq为0,请求建立连接。
    第二次
    192.168.3.230 TCP 192.168.3.222 9501 → 52360 [SYN, ACK] Seq=0 Ack=1
    服务端收到客户端的请求信息,做确认处理,生成确认信息Ack=客户端的Seq+1。并将服务端包的编号Seq=0一起发送给客户端。这样服务端就发送了2个命令:[SYN]和[ACK]。
    第三次
    192.168.3.222 TCP 192.168.3.230 52360 → 9501 [ACK] Seq=1 Ack=1 Win=131328 Len=0
    客户端收到服务端的信息,将客户端的Seq+1后和服务端返回的确认信息Ack做比较,如果一致,说明服务端没问题。然后再根据服务端发来的Seq+1生成客户端的确认信息Ack,发送给服务端。服务端根据自己的Seq+1跟客户端发送过来的确认信息Ack做比较,如果一致,双方可以建立连接。

    最后再看下握手数据,主要是前三条,如图:

    提供下比较经典的三次握手图:

    参考:
    https://www.cnblogs.com/cenglinjinran/p/8482412.html
    https://www.cnblogs.com/zcbing/p/6397496.html
    https://baijiahao.baidu.com/s?id=1614404084382122793&wfr=spider&for=pc
    https://blog.csdn.net/qq_38950316/article/details/81087809
    https://baijiahao.baidu.com/s?id=1614404084382122793&wfr=spider&for=pc

  • 相关阅读:
    根据中国气象局提供的API接口实现天气查询
    小程序——云函数发送请求
    apifm-wxapi API工厂
    首次使用 linux 阿里云服务器,入门及使用
    Android立体旋转动画实现与封装(支持以X、Y、Z三个轴为轴心旋转)
    Android来电监听和去电监听
    Android 源码下载方法(Git 方式clone)
    HandlerThread 创建一个异步的后台线程
    Android Toast cancel和show 不踩中不会知道的坑
    PopupWindow 点击外部和返回键无法消失背后的真相(setBackgroundDrawable(Drawable background))
  • 原文地址:https://www.cnblogs.com/subendong/p/12152575.html
Copyright © 2011-2022 走看看