zoukankan      html  css  js  c++  java
  • 网络分层和TCP三次握手

    它们就是 OSI 的七层模型,和 TCP/IP 的四层 / 五层模型。这两种模型的最大区别,就是前者在传输层和应用层之间,还有会话层和表示层,而后者没有。

     

    TCP三次握手:

    位码即tcp标志位,有6种标示:

    ①  SYN(synchronous建立联机);

    ②  ACK(acknowledgement 确认)

    ③  PSH(push传送)

    ④  FIN(finish结束)

    ⑤  RST(reset重置)

    ⑥  URG(urgent紧急)

    Sequence number(顺序号码) //Acknowledge number(确认号码)

    第一次握手:主机A发送位码为SYN=1,随机产生seq number=1234567的数据包到服务器,主机B由SYN=1知道,A要求建立联机;

    第二次握手,主机B收到请求后要确认联机信息,向A发送ack number=(主机A的seq+1),SYN=1,ACK=1,随机产生seq number=7654321的包;

    第三次握手:主机A收到后检查ack number是否正确,即第一次发送的seq number+1,以及位码ACK是否为1,若正确,主机A会再发送ack number=(主机B的seq+1),ACK=1,主机B收到后确认seq值与ACK=1则连接建立成功。

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

    acknowledge number:表示的是期望的对方(接收方)的下一次sequence number是多少。注意SYN/FIN的传输,虽然没有data,但是会让下一次传输的packet seq增加一但是, ACK 的传输,不会让下一次的传输 packet seq 加一

    1、为什么建立连接协议是三次握手,而关闭连接却是四次握手呢?

    建立连接时,ACK和SYN可以放在一个报文里来发送。而关闭连接时,被动关闭方可能还需要发送一些数据后,再发送FIN报文表示同意现在可以关闭连接了,所以它这里的ACK报文和FIN报文多数情况下都是分开发送的。

    2、为什么TIME_WAIT状态还需要等2MSL后才能返回到CLOSED状态?

    两个存在的理由:1、无法保证最后发送的ACK报文会一定被对方收到,所以需要重发可能丢失的ACK报文。2、关闭链接一段时间后可能会在相同的IP地址和端口建立新的连接,为了防止旧连接的重复分组在新连接已经终止后再现。2MSL足以让分组最多存活msl秒被丢弃。

    3、为什么必须是三次握手,不能用两次握手进行连接?

    记住服务器的资源宝贵不能浪费!  如果在断开连接后,第一次握手请求连接的包才到会使服务器打开连接,占用资源而且容易被恶意攻击!防止攻击的方法,缩短服务器等待时间。两次握手容易死锁。如果服务器的应答分组在传输中丢失,将不知道S建立什么样的序列号,C认为连接还未建立成功,将忽略S发来的任何数据分组,只等待连接确认应答分组。而S在发出的分组超时后,重复发送同样的分组。这样就形成了死锁。

    本文转自 https://juejin.cn/post/6985509343454052365,如有侵权,请联系删除。

    作者:tigergao
    功不唐捐 玉汝于成
  • 相关阅读:
    static 和final
    Integer中getInteger(),valueof()
    Integer和String "+""=="方法的不同
    java中Integer常量池
    用jvm指令分析String 常量池
    多线程、线程安全
    String字符串缓冲区、StringBuffer
    TCP通信---文件上传案例、多线程文件上传
    网络通信协议、UDP通信、TCP通信
    Java线程-- 线程池
  • 原文地址:https://www.cnblogs.com/tigergaonotes/p/15805878.html
Copyright © 2011-2022 走看看