从输入网址到显示页面全过程概览(持续更新)

从输入网址到显示页面全过程概览(持续更新)

上图为宏观的总体过程,接下来是一步步的讲解
一、应用程序客户端部分(通常为浏览器)
1、对URL进行解析,获取协议、域名、访问的文件名
2、按照相应的协议生成请求消息(请求行,消息头(通用头,请求头,实体头 ),请求实体)
3、DNS查询解析
  • DNS本地缓存和DNS服务器缓存
  • DNS解析器其实就是操作系统中的socket库(用于调用网络功能的程序组件的集合)的一段代码。浏览器等应用程序的源码里会调用这段解析器程序,传入域名,获得IP地址
4、DNS大接力
  • 每一台DNS服务器中都保存着根域DNS服务器的IP地址
  • 当附近的DNS服务器中查询不到IP的时候,就会把DNS请求消息直接发送给根域DNS服务器
  • 根域DNS服务器会向这台附近的DNS服务器返回下一级域名的DNS服务器的IP地址,这台附近的DNS服务器再向这个收到的IP地址发出请求
  • 依次顺藤摸瓜找到目标IP
5、委托给操作系统的协议栈

注意点
  • 子网掩码表示网络号与主机号的边界,这个边界可以在句点的位置,也可以在中间的位置。本质上是,1的部分表示网络号,0的部分表示主机号
  • 域名和IP共用的原因:在TCP/IP 设计之初,域名方便人们记忆,而IP采用数字则更适合机器识别,减少路由器的负担(域名的字节数更多,且长度可变会造成路由器效率低下)
  • DNS不仅能关联域名和IP还能关联其他信息,比如邮件地址和邮件服务器

二、操作系统部分—TCP模块(属于TCP/IP协议栈)
1、套接字:是协议栈工作的必要的控制信息,根据协议栈的实现不同,套接字中控制信息也有所不同,但是收发的IP,PID,状态等都是共同的。由于套接字是在本地的,无法被对方知道,并且套接字中的内容也有所不同,所以要把套接字中的一部分控制信息写入网络包的头部。即使套接字所有不同,但是只要网络包遵循协议写入了必要的头部控制信息,就可以完成数据的收发操作。
2、创建套接字,就是由计算机分配一个内存空间,并写入初始信息
3、连接的目的:告诉客户端,服务器的IP、port;告诉服务器,客户端的ip、port,分配缓冲区 
4、连接的过程
    ①在TCP模块处,将数据切分为多个数据包(数据很小的时候不用),并为每个数据包创建头部信息(每个切分后的数据包都有自己序号,保证接收方正确接收到数据)
    ②发送给服务器
    ③服务器根据发送方的端口号找到对应的套接字,将状态改为正在连接,并写入一些信息
    ④客户端收到返回并且SYN为1的话就把客户端的套接字改为连接完毕,并在这时把ip和端口号保存到客户端套接字
    ⑤客户端发送数据,ACK=1,服务端接收之后,服务端状态改为连接成功
5.收发数据的过程
6.删除套接字的过程
7.UDP模块:(1)发送控制用的短数据音(2)发送音视频数据

三 操作系统部分-IP模块(属于TCP/IP协议栈)
1.接收消息的时候
①确认头部的目的地IP是不是自己的,如果是,则接收,否则就丢弃并传递ICMP消息
②分片重组

四 操作系统部分-网卡部分
1.网卡的MAC模块的作用:
①在IP包的前面加上报头和起始帧分节符
②发送的时候在末尾加上FCS(帧校验序列);接收的时候还要检查FCS,有误的话就丢弃这个包
③发送的时候把数字信号转换为通用电信号;接收的时候把通用电信号转换为数字信号,存到缓冲区中,校验无误再比较MAC头部的接收方MAC地址,不一致则丢弃该包
2.PHY(MAU)模块的作用(信号收发模块)
将MAC模块产生的通用电信号进行格式转换,转换为适应各种网线的特殊格式信号,然后通过网线发送出去
3.发送信号的操作分为两种
①使用中继式集线器(也叫做共享式集线器,简称集线器)的半双工模式:发出的信号是发送给集线器上的所有设备,所有设备都要通过MAC地址来判断接收包还是丢弃包
②采用交换式集线器(简称交换机)的全双工模式:信号只会流到根据MAC地址指定的设备