• 访问一个网站,发生了什么?


    输入URL,点击回车,然后发生了啥捏。

    总体分4步:

    1、DNS域名解析,得到IP,进行访问

    2、TCP三次握手建立连接

    3、发送与接收数据

    4、TCP四次挥手断开连接

    详细点讲:

    1:访问两种方式--ip(不好记)和域名。输入域名,还要DNS服务器转换成ip的。

    DNS域名解析时用的是UDP协议。整个域名解析的过程如下:

    1. 浏览器向本机DNS模块发出DNS请求,DNS模块生成相关的DNS报文
    2. DNS模块将生成的DNS报文传递给传输层的UDP协议单元
    3. UDP协议单元将该数据封装成UDP数据报,传递给网络层的IP协议单元
    4. IP协议单元将该数据封装成IP数据包,其目的IP地址为DNS服务器的IP地址;
    5. 封装好的IP数据包将传递给数据链路层的协议单元进行发送;
    6. 发送时在ARP缓存中查询相关数据,如果没有,就发送ARP广播(包含待查询的IP地址,收到广播的主机检查自己的IP,符合条件的主机将含有自己MAC地址的ARP包发送给ARP广播的主机)请求,等待ARP回应;
    7. 得到ARP回应后,将IP地址与路由的下一跳MAC地址对应的信息写入ARP缓存表;
    8. 写入缓存后,以路由下一跳的地址填充目的MAC地址,以数据帧形式转发;
    9. 转发可能进行多次;
    10. DNS请求到达DNS服务器的数据链路层协议单元
    11. DNS服务器的数据链路层协议单元解析数据帧,将内部的IP数据包传递给网络层IP协议单元;
    12. DNS服务器的IP协议单元解析IP数据包,将内部的UDP数据报传递给传输层UDP协议单元;
    13. DNS服务器的UDP协议单元解析收到的UDP数据报,将内部的DNS报文传递给DNS服务单元;
    14. DNS服务单元将域名解析成对应IP地址,产生DNS回应报文
    15. DNS回应报文->UDP->IP->MAC->我的主机;
    16. 我的主机收到数据帧,将数据帧->IP->UDP->浏览器;
    17. 将域名解析结果以域名和IP地址对应的形式写入DNS缓存表。

    TCP三次握手:

    这是最基本的一个问题了,描述三次握手:

    1、客户端发送SYN包,序列号为j,进入SYN_SEND状态;

    2、服务器端接收到SYN包,必须确认SYN包(确认报文ACK,序列号为j+1),同时自己也发送一个SYN包,序列号为k,此时服务器端进入SYN_RECV状态;

    3、客户端接收到这两个包ACK+SYN包,回复一个ACK包,序列号为k+1,此时客户端处于建立连接状态;

    4、服务器接收到ACK包,处于建立连接状态。

    可以开始传输数据啦!!!

    问:客户端什么情况才处于建立连接状态?服务端什么时候处于建立连接状态?为啥不能两次握手就得了?

    客户端简单,申请建立连接,收到服务器的确认包(ACK+ SYN)就处于建立连接喽;服务器从收到请求,到发出确认包,再到收到确认包,才建立连接;

    两次握手,会有无效连接占用服务器资源的危险。比如,客户端发送请求,结果由于网络原因,滞后了;然后过段时间(客户端认为是无效请求了),服务器接到了,发了个确认包,如果两次握手,这就意味着服务器认为和客户端建立了连接,那么就会

  • 相关阅读:
    ubuntu:activate root
    C/C++ char* arr与char arr[]的区别(反汇编解析)
    [转]关于编写Nios II的延时函数的一点心得
    [转]Xilinx Vivado的使用详细介绍(1):创建工程、编写代码、行为仿真、Testbench
    [转]Vivado中IP的使用方法
    [转]Vivado IP核生成设置
    [转]VHDL中数据类型转换与移位(STD_LOGIC_ARITH与NUMERIC_STD)
    [转]Vivado与SDK的联合调试方法-使用ILA
    [转]Vivado中ILA的使用
    [转]vivado硬件调试——mark_debug
  • 原文地址:https://www.cnblogs.com/westlife-11358/p/9667111.html
Copyright © 2020-2023  润新知