浏览器输入网址之后发生了什么
1,浏览器解析url,本质就是请求服务器的文件资源。
2,http协议生成请求报文,有get和post格式。
3,DNS解析 -查询域名所在的ip地址。
DNS从右往左(www.刘昊然.com) 分为 根DNS服务器(最上层看不见),顶级域DNS服务器(com),权威DNS服务器(刘昊然.com)。
根域的 DNS 服务器信息保存在互联⽹中所有的 DNS 服务器中,所以找到任意一台DNS,就能找到ip地址了。
这里生成新问题域名解析的工作流程,这问题之后写。
4,得到IP地址后,接下来给操作系统里的协议栈,协议栈工作流程见下面问题。
5,总结的4的过程
- TCP协议将请求报文分割成报文段,进行可靠传输
- IP协议进行分组转发
- TCP协议重组请求报文
- HTTP协议对请求进行处理
域名解析的工作流程
1,客户端会发起一个DNS请求,问域名的ip是啥,首先给本地DNS服务器(就是客户端的TCP/IP设置中填写的DNS服务器地址)。本地DNS服务器收到请求后,如果缓存能找到域名,就直接返回ip。
2,如果缓存里没有,本地DNS就去问根域名服务器,然后根域名服务器会告诉你这个域名的顶级域DNS服务器,如www.刘昊然.com,根DNS服务器会告诉你com所在的顶级域DNS服务器的地址。
3,然后本地DNS发请求问顶级域dns服务器的权威DNS服务器地址。
4,然后权威DNS服务器就会告诉本地DNS这个域名的ip。
5,本地将IP地址返回客户端,同时存入缓存,客服端和目标建立连接。
协议栈工作流程
1,浏览器先调用socket库,来委托协议栈工作。
2,协议栈分两部分,分别是
- 负责数据收发的TCP和UDP协议。
- IP 协议控制⽹络包收发操作。在互联⽹上传数据时,TCP将数据切分成⼀块块的⽹络包,⽽将⽹络包发送给对⽅的操作就是由 IP 负责的。
IP协议有两层
- ICMP协议,用于告知网络包传送过程中产生的错误以及各种控制的错误信息。
- ARP 用于根据IP地址 查询 相应的以太网MAC地址。
3,IP 下⾯的⽹卡驱动程序负责控制⽹卡硬件,⽽最下⾯的⽹卡则负责完成实际的收发操作,也就是对⽹线中的信号执⾏发送和接收操作。
TCP - 可靠传输
HTTP是基于TCP来传输的。
TCP报文格式
- 源端口号和目的端口号必须要的,不然数据不知道发给哪个应用。
- 序号确定数据包的顺序。
- 确认序列
- 状态位:SYN是发起连接,ACK是确认,RST是重启连接,FIN是结束连接。
TCP 是⾯向连接的,因⽽双⽅要维护连接的状态,这些带状态位的包的发送,会引起双⽅的状态变更。
- 还有⼀个重要的就是窗⼝⼤⼩。TCP 要做流量控制,通信双⽅各声明⼀个窗⼝(缓存⼤⼩),标识⾃⼰当前能够的处理能⼒,别发送的太快,撑死我,也别发的太慢,饿死我。
- 除了做流ᰁ控制以外,TCP还会做拥塞控制,对于真正的通路堵⻋不堵⻋,它⽆能为⼒,唯⼀能做的就是控制⾃⼰,也即控制发送的速度。不能改变世界,就改变⾃⼰嘛。
在 HTTP 传输数据之前,⾸先需要 TCP 建⽴连接,TCP 连接的建⽴,通常称为三次握⼿。
第一次握手:客户端和服务端处在closed状态,客户端发SYN给服务端。
第二次握手:服务端收到SYN后,发送客户端一个SYN和ACK。
第三次握手:客户端收到后,发送服务端一个ACK的ACK。然后客户端和服务器建立连接。
所以三次握手的是保证双方都有发送和接收的能力。
TCP 的连接状态查看,在 Linux 可以通过 netstat -napt 命令查看。
三次握手的原因:
三次握⼿才可以阻⽌重复历史连接的初始化(主要原因) 三次握⼿才可以同步双⽅的初始序列号 三次握⼿才可以避免资源浪费
断开需要用4次握手
第一次握手:客户端给服务端发送FIN,然后客户端处于不发送数据能接受数据的状态。
第二次握手:服务端给客户端发送ACK,确认,然后服务器还有数据要处理或发送。
第三次握手:等服务端处理完,发送第二次FIN,确实现在可以停止连接了。
第四次握手:客户端发送ACK确认,然后断开连接。
为什么需要四次握手,上面就是原因了。因为服务器要处理数据,不能和连接时一样。
TCP如何分割数据
如何http数据长度超过MSS长度时,需要分割。
分割数据然后每一块都要加上tcp头,再加上ip头。
具体见 图解网络 384页。
TCP生成报文
具体见 图解网络 385页。
两点传输 MAC
⽣成了 IP 头部之后,接下来⽹络包还需要在 IP 头部的前⾯加上 MAC 头部。
MAC 头部是以太⽹使⽤的头部,它包含了接收⽅和发送⽅的 MAC 地址等信息。
MAC头格式
ip协议里的ARP协议用于获取MAC地址。