美文网首页
001-- 网络连接过程

001-- 网络连接过程

作者: 修_远 | 来源:发表于2020-06-18 12:46 被阅读0次

    [TOC]

    专有名词

    • seq(sequence number):表示我方(发送方)这边,这个 packet 的数据部分的第一位应该在 data stream 中所在的位置。(这里用的是“应该”。因为对于没有数据的传输,如 ACK,虽然它有一个 seq,但是这次传输在整个 data stream 中是不占位置的,所以下一个实际有数据的传输,会从上一次发送 ACK 的数据包的 seq 开始)。

    • SYN:表示建立连接。传输虽然没有 data,但是会让下一次传输的 packet seq加一。

    • ACK(acknowledge number):表示响应。期望对方(接收方)的下一次 sequence number 是多少。但 ACK 的传输不会让下一次的 packet 加一。

    • FIN(finish):表示关闭连接。传输虽然也没有 data,但是会让下一次传输的 packet seq加一。

    • PSH:表示有 DATA数据传输,

    • RST:表示连接重置。

    HTTP 传输过程

    这篇文章的标题虽然是连接过程,但这里其实是 HTTP数据交互的一个过程,我们知道HTTP是无连接的,所以这里需要注意下

    1. 客户端向服务端发送请求报文;
    2. 服务端根据请求报文收集对应的资源组合成响应报文;
    3. 客户端收到时响应报文,进行解析;
    HTTP数据传输过程

    TCP 三次握手连接过程

    1. 客户端发送 SYN 到服务端,等待确认;
    2. 服务端向客户端返回 ACK,同时,自己也发送一个SYN包,即 SYN + ACK 包;
    3. 客户端收到回应,向服务端发送确认包 ACK;
    4. 完成三次握手,客户端与服务端开始传输数据;
    TCP 三次握手连接过程

    实例

    TCP协议中的seq/ack序号是如何变化的?

    TCP数据包交互过程

    过程1:客户端发送 SYN 到服务端

    • seq=0:第一次握手。client 端第一次发送 packet。按照上面的原则,他的数据应该是从第一个开始,也就是第 0 位开始,所以此时 seq=0
    • ack=0:server 端之前从未发送过数据。所以 client 期望 server 回传的 seq 是从第一个开始,所以此时 ack=0

    过程2:服务端向客户端返回 ACK,同时,自己也发送一个SYN包,即 SYN + ACK 包

    • seq=0:第二次握手。server 端第一次发送 packet。上面介绍过了,ack 表示对方期望我方本次传输的 seq 的值,我方(server)接收到的对方(client)传来的 ack=0,说明 client 端希望 server 端回传的 seq=0
    • ack=1:在【过程1】中,本次 packet 传输的 seq=0,而 server 端返回的是SYN+ACK,根据上面的规则,SYN 的传输会让 seq+1。server 端知道自己本次传输的有 SYN,所以会告诉 client,下一次的 seq 需要 +1,所以 ack=1

    过程3:客户端收到回应,向服务端发送确认包 ACK

    • seq=1:第三次握手。【过程2】中,ack=1,server 端期望 client 端 的 seq,所以 seq=1
    • ack=1:根据上面的原则,ACK 的传输不会让 seq+1。而 client 端知道自己本次传输的是 ACK,所以会告诉 server,下一次的 seq 还是1,所以 ack=1

    到这里,已经完成三次握手,客户端与服务端开始传输数据

    过程4:客户端向服务端发送数据请求,len=725

    • seq=1
    • ack=1

    三次握手接受后,客户端和服务端已经建立了连接,服务端不需要再向客户端返回信息。而这里是客户端第一次向服务端发送数据,所以 seq 和 ack 都是用的上一次的结果。

    过程5:服务端应答客户端的请求:返回确认包 ACK

    • seq=1:结果仍然是对方期望的值,客户端的ack=1
    • ack=726:本次服务端接收到的 seq=1,数据包长度是 725。服务端本次返回客户端的是 ACK,不会对 seq 造成影响,所以期望的下一次客户端的 seq=1+725

    过程6:服务端响应客户端的请求:返回数据包,len=1448

    • seq=1
    • ack=726

    过程7:客户端收到服务端的响应数据:返回确认包 ACK

    • seq=726:分析到这一步,应该是很清晰了,己方的 seq,就是对方上一个包的 ack;
    • ack=1449:得到 seq=726,数据包长度为:1448,则客户端期望服务端下一次的 seq=1+1448

    后面的过程雷同,就不在展开分析了

    TCP 四次挥手断开过程

    1. 客户端发送 FIN,提醒服务端自己准备关闭通信;
    2. 服务端收到 FIN,回应 ACK;
    3. 服务端发送 FIN,提醒客户端自己准备关闭通信;
    4. 客户端收到 ACK + FIN,回应一个 ACK;
    5. 四次挥手完毕,关闭连接;
    TCP 四次挥手

    HTTPS 连接过程

    主要过程分为四个

    1. 第一次握手:交换基本信息
    2. 第二次握手:确定加密策略
    3. SSL建立成功:HTTP数据传输
    4. 数据传输完成:断开连接
    1. 第一次握手:交换基本信息
    1. 客户端想服务端法发送一个打招呼报文(hello),包含自己支持的SSL版本、加密算法等信息;

    2. 服务端回复一个打招呼报文(hi),包含自己支持的SSL版本、加密算法等信息;

    3. 服务端发送自己经过 CA 认证的公开密钥

      1. 服务端向 CA 认证机构发送自己的公开密钥(FPKey)
      2. CA 认证机构使用自己的私有密钥给 FPKey 加上签名,并返回给服务端;
    4. 服务端发送结束招呼报文,SSL第一次握手结束;

    1. 第二次握手:确定加密策略
    1. 客户端使用 FPKey,对自己的随机密码串(CKey)进行加密并发送给服务端。客户端使用 CA 的公开密钥对 FPKey 的签名进行认证,确保密钥未被替换;
    2. 客户端发送提示报文,后续报文经用 CKey 进行加密;
    3. 客户端发送 finished 报文,表示该次发送结束。后续是否继续通信取决于客户端的 finished 报文能否被服务端成功解密
    4. 服务端发送提示报文,表示它之后的报文也会用 CKey 进行加密
    5. 服务端发送 finished 报文。至此 SSL 握手结束,成功建立 SSL 连接。
    1. SSL建立成功:HTTP数据传输
    1. 客户端开始发送 HTTP 请求报文。建立 TCP 链接,开始传输数据
    2. 客户端发送 HTTP 回复报文
    1. 数据传输完成:断开连接

    客户端发送断开链接报文,并断开 TCP 连接

    HTTPS连接过程

    HTTPS 中间人拦截过程

    中间人拦截过程发生在第一个部分,拦截服务端返回的公钥,构建一对新的密钥伪装成公钥发送给客户端。然后拿到客户端的随机数,再用服务端的公钥进行加密,将密钥发送给服务端。

    image

    参考链接:
    Http和https建立连接全过程
    深入揭秘HTTPS安全问题&连接建立全过程
    TCP协议中的seq/ack序号是如何变化的?

    相关文章

      网友评论

          本文标题:001-- 网络连接过程

          本文链接:https://www.haomeiwen.com/subject/vbquxktx.html