跟踪浏览器输入一个网址到最后浏览器展示出来一个滨才波澜的网页的过程基本就是 一次网络协议的过程。
第一步:浏览器输入网址。
浏览器里面输入一个URL ,其实就是相当于发送一次get请求去理解。
一般正式环境我们浏览器上输入的都是域名,不是四段式IP。
当浏览器输入url 按回车之后 ,第一步就是 进行域名转换IP。也叫 DNS解析过程。
- 浏览器会先询问 操作系统的hosts 文件,查看里面是否有域名和IP 的映射,如果有 直接拿来使用, 如果没有浏览器会发起DNS请求,查找域名对应的IP。
- 浏览器会先向本地DNS服务器发起请求。(本地DNS服务器并不是本机的一个服务器,他也是一个服务器只是叫做本地DNS服务器,也是个远程的服务器。一般本地DNS服务器就是你介入的网络的运营商的一个DNS服务器。默认我们在联网的时候 DCHP为我们配置的DNS服务器地址叫做本地服务器。也可以自己配置)(DCHP,是一个协议,是指我们在联网的时候,路由器利用这个协议自动我们电脑分配一个IP地址的协议)。
- 本地DNS服务器会先查看缓存,看是之前查找过改域名的IP。如果没有,本地DNS服务器会向根DNS服务器请求IP地址,根DNS服务器会返回可以查到的IP地址的DNS服务器地址给你, 你在去请求该DNS服务器查询IP。此过程轮询直至找到最终的IP。(DNS服务器器有个特点,就是每一台DNS服务器都存有根DNS服务器地址,上一级DNS服务器 存有下一级DNS服务器地址)。
第二步:查找完毕IP之后 ,客户端构造一个随机端口发送请求。由于属于HTTP(s)请求,开始 TCP 建立连接过程和TLS握手过程。
- 三次握手
1。客户端 发送 SYN 标志位为1,seq序列号为随机数Q1的同步请求 到服务器,请求建立连接。客户端请求之前处于close 状态, 发送完毕SYN报文 之后处于 SYN-SEND 状态。
2。服务器在接收到SYN请求之前一直处于listening 状态。接收到SYN 报文之后 处于 SYN-RECEVIED状态。并发送 SYN 标志位为1,seq序列号为数据数的Q2,ACK标志位为1 ack 确认号为 Q1+1 的报文给客户端作为回复。
3。 客户端 在接收到 服务器返回的ACK 报文之后。 再给服务器回复一个ACK 标志位为1 ,ack 确认号为 Q2+1 ,SEQ 标志位虽为0,但是seq 序列号为 Q1+1的确认报文。
注释: 客户端第一次握手发给服务端的Q1 和 服务端第二次握手发给客户端的Q2 ,两次序列号是不同的,为啥需要俩随机数,理解为:客户端发给服务端的消息用Q1, 服务端发给客户端的用Q2。 这俩值是不一样的。
每次报文的seq 序列号代表的含义是 我本次发送的消息是我整体消息的第几个编号位置+我的随机数序列号(编号概念是指:一个消息可能过大,分成两次发送,第一次发送0-100 字节, 第二次发送的时候就是100-200字节。为了标记我是哪个消息,把消息编号了。)
每次报文的ack 序列号的值的概念 是值 我收到了消息,并且希望你下次发送过来的消息的开始编号是多少,这里是希望对方发送过来的编号,所以ack得值都是对方的seq随机数的+接收到的消息的位置。
问题:为啥三次握手?
答案:为了 保证传输的可靠性。确保建立了连接。需要三次握手,如果只要两次握手, 最后一次客户端到服务端的ACK 确认握手不发送。可能会造成服务器资源浪费。eg:我第一次发送的SYN 报文,如果网络比较慢超时了,我客户端会重发消息给服务端,这次重发的来得快。然后服务器直接发送个ACK 就建立了连接。 然后过了一会 那条超时的SYN消息来到了服务器。服务器 没法区分你这次SYN 报文 。是我发的ACK报文你没接到。还是说 是 之前超时的报文。我就只能再ACK 消息给客户端。
第三步:建立完TCP 链接 。建立TLS 链接。(https)
1 . 客户端发送client hello 到服务器 交换信息 (包括客户端支持的加密算法)。
- 服务器发送 选择的加密算法,https数字证书等信息到客户端。
- 客户端校验https 数字证书。
- 根据加密算法选择方式 构造加密秘钥。
- finsh.验证下加密秘钥。
数字证书简单介绍:
CA或者自签名的 一个文件。包含了 签发机构,域名,非对称加密的公钥 等信息。证书校验是指 在证书尾部携带了一个MD5的摘要信息,用CA机构的私钥加密的,CA 机构的公钥是配置在浏览器里面的,用这个公钥解密得到摘要,和证书本身计算出来的摘要丢比。一样就是没有被篡改。从证书得到的非对称加密的公钥可以放心使用。
非对称机密:一对公钥私钥,私钥加密,公钥解密,公钥加密,私钥解密。:RSA等
对称加密: 公钥,私钥是一个。 DES 3DES,AES。
摘要:MD5, SHA 算法。不可逆。
具体知识 自学。
TSL 交互过程 计算对称加密秘钥过程。
1,老的方式是从数字证书拿到非对称加密公钥。客户端生成对称加密秘钥AES,用非对称加密公钥进行加密 发送给服务器,服务器用私钥解密得到对称机密秘钥。
- 新的方式, 可以采用一些算法, 客户端和服务器 各自计算出来 秘钥过程。一些参数 就算在网络上传递 也不怕 秘钥被篡改。eg DH算法,DCEH算法。都不在用老的方式了。
第四步,TLS建立连接之后,就可以发送HTTP请求了。 构造HTTP 报文发送到 传输层构造TCP 首部信息 拼接上端口。
第五步 将 传输层数据发送到网络层 。 拼接网络层首部 源ip地址 目标IP地址。
第六步,将 网络层IP数据发送到数据链路层,构造链路层首部和尾部FCS。首部包括源MAC地址和目标mac地址。
注释:在这一步 我们通常是把信息先发给路由器。所以 目标MAC地址 先路由器的mac地址, 采用ARP 协议,发广播寻找mac地址,之后发送到路由器。
路由器和路由器之间是 PPP协议, 不携带目标mac 和源mac地址。点对点发送消息 不需要目标mac地址。不在寻址了。
第七步。数据链路层 发送到物理层 将消息发送到服务器。
第八步 服务器接收到消息 层层解析。最后转发到 服务器java代码上去。
第九步,四次分手。断开连接。
1.发送端 发送finish 报文到接收端。 表达 我没什么消息要发给你了。 我这边不会再给你发消息了。 我要请求断开连接。发送完毕处于 finish-wait1
2.接收端 收到了消息,发送一个ACK 确认报文,告知发送端,我知道了。但是我还有些消息要发,我先发完。
3,接收端发完消息之后 在发送个 finish报文,表达 我也没什么消息 了。
4.发送端 在接收到 接收端发送的“第2步”的ACK 确认报文。处于 finish-wait2阶段。
5.在接受到 第三步的finish 报文之后 ,发送个ACK 报文 到接受端告知我知道了 关闭连接。然后处于 time-wait 阶段, 等待2TTA时间。然后关闭连接。
为什么四次分手。
答: 因为 分手的时候属于双向通信。发送finish 消息 只是表示 我没什么发送给你了, 但是 我还可接受消息,可能对方还可能发消息给你。所以需要四次。接收方发送完消息之后 ,在发送一个finish 报文告诉发送方 我也没什么发给你了, 咱么断开连接吧。才真正断开连接。
为什么最后一步发送方需要等待2个TTA时间?
答: 为了防止此次发送的报文 丢包。如果2个tta时长过去 都没有收到服务器消息, 就代表 服务器收到了我 最后的确认报文。
网友评论