浏览器输入url后发生的操作做个简单概述

264 阅读7分钟

最近在看《网络是怎样连接的》一书,目前看到了路由器转发,对之前疑惑的浏览器输入url后发生的操作做个简单概述,欢迎大家一起交流,共同学习!

用户在浏览器输入 url之后简述:

  1. 生成http消息 请求行+请求头 + 请求体

  2. 应用程序利用socket库调用协议栈 将域名通过DNS解析成ip

  3. 协议栈中使用传输层协议以 TCP为例 加入TCP头部(发送方端口、接收方端口、序号、窗口等) 打成TCP包  TCP通过三次握手建立连接

  4. 委托给IP协议拿到TCP包后 加入IP头部(TTL、校验和、接受方IP、发送方IP等)打包成IP包 之后交给数据链路层(交给链路层时已经转换成数字信号即二进制)

  5. 在网卡中 加入以太网头部(mac地址)打包成以太网包(尾部会加一个FCS校验值即是对整个以太网包算出的值,接收包的设备会核对FCS如何FCS改变则会丢弃包) 将数字信号转化成电信号 进入网线 中间通过 交换机或路由器等转发设备  到达服务器 服务器根据相反流程解包后给出响应包 以相同流程向浏览器发送响应 从而浏览器拿到数据包展示页面数据

根据看书前的一些疑问做个简单的解答:

1. 通过http协议生成http消息 请求行+请求头 + 请求体

请求消息组成部分:

  • 请求消息的第一行是请求行包含 请求方法、空格、uri、空格、http版本号;
  • 接下来是请求头表示请求的附加信息,根据具体情况可变 直到空行;
  • 最后是请求体 客户端向服务端发送的数据例如POST传递的参数 可选;

响应消息和请求消息差别:

  • 请求行:请求方法、空格、uri、空格、http版本号 响应行:http版本号、空格、状态码、空格、响应短语 (例如:404 的响应短语就是not found)
  • 请求头和响应头参数

请求方法:GET、POST、HEAD、OPTIONS、PUT、DELETE、TRACE、CONNECT

http状态码

  • 1XX 告知请求的处理进度和情况

  • 2XX 成功

  • 3XX 表示需要进一步操作

  • 4XX 客户端错误

  • 5XX 服务器错误

    浏览器如何看待用户输入的uri: 将用户输入的uri 解析为协议、服务器名称、数据源路径

    get请求有没有实体:通常get方法没有请求体 习惯上, get 请求都认为是对uri数据的传输

   2. 之后应用程序利用socket库调用协议栈 将域名通过DNS解析成ip

  • DNS先通过读取本地的DNS缓存。如果本地缓存没有,就会去请求路由器的DNS缓存。路由器缓存没有,就会去请求网络运营商的DNS 缓存, 大部分解析到了这里结束了。如果还没有 就会到DNS服务器中通过一级二级域名这种顺序进行递归查询, 直到查到对应级别域名服务器后通过以上相反流程依次返回最终将ip返回给我们。

常识:

  • ipconfig /flushdns刷新DNS缓存
  • soket协议栈是操作系统给应用程序暴露的接口
  • DNS服务器默认端口是53

    3.将消息包给到 TCP  TCP通过三次握手建立连接

  1. 第一次握手是客户端向服务端发送 SYN(syn是随机生成的)
  2. 第二次握手服务器通过客户端的syn+1算出ack并加上自己的syn返回给客户端
  3. 第三次 客户端通过服务器的syn+1算出ack发送给服务器 服务器收到后确认无误连接建立成功
  4. 数据双向通信

常见疑问1>为什么是三次握手而不是两次 ? 因为两次握手可以保证客户端向服务器发送包没问题,由于服务器还没有收到客户端的ack 所以不能保证 服务器向客户端发送包没问题.

常见疑问2>为什么是四次挥手不是三次? 因为TCP是全双工也就是双向数据流通,第一次挥手:主动方发送断开连接的请求(即FIN报文)给被动方。 第二次挥手:被动方此时有可能还有相应的数据报文需要发送,因此需要先发送ACK报文,告知主动方“我已知道你想断开连接的请求了”。这样主动方便不会因为没有收到应答而继续发送断开连接的请求(即FIN报文)。第三次挥手 :被动方在处理完数据报文后,便发送给主动方FIN报文;这样可以保证数据通信正常可靠地完成。发送完FIN报文后,被动方进入LAST_ACK阶段(超时等待) 第四挥手:如果主动方及时发送ACK报文进行连接中断的确认,这时被动方就直接释放连接,进入可用状态。

常见疑问3>为什么我们说TCP是安全传输? 我们通常说TCP三次握手建立连接,会让我们认为只发送了三次的网络包,其实三次只是理想状态下,假如我们发送第一次握手时由于受到网速、掉线等原因导致包被丢弃了,发送方迟迟等不到回应会怎样呢?你觉得发送方会继续一直等待下去吗?其实不是在网络中丢弃的网络包大有可在,那么TCP如何保证安全呢? TCP会隔段时间持续发送直到收到接收方的响应包为止,由此保证了数据的安全传输。

常见疑问4>为什么我们经常说把IP和TCP不分家? 为了提高效率,TCP可以操作IP的部分内容可以拿到IP地址,这个我们之后再详细解释

    4. IP拿到TCP包后 加入IP头部(TTL、校验和、接受方IP、发送方IP等)打包成IP包 之后交给数据链路层(交给链路层时已经转换成数字信号即二进制)

网络包中加入TTL字段有8 bit 最大值255 推荐值是64 也就是网络包的最大转发次数。在网络中每转发一次数值减一,当值为零时此网络包将会被丢弃 IP包将TCP包转换成一个二进制表示的数据

    5. 在网卡中 加入以太网头部(mac地址)打包成以太网包(尾部会加一个FCS校验值即是对整个以太网包算出的值,接收包的设备会核对FCS如过FCS改变则会丢弃包) 将数字信号转化成电信号 进入网线 中间通过 交换机或路由器等转发设备  到达服务器 服务器根据相反流程解包后给出响应包 以相同流程向浏览器发送响应 从而浏览器拿到数据包展示页面数据 实际的显示操作是由操作系统来完成的,浏览器负责对操作系统发出指令,例如在屏幕上的什么位置显示什么文字、使用什么样的字体等   操作系统最终通过显卡进行绘制

因为还在继续学习后期将会不断完善!也希望理解层面更高的大佬能做指点!