从一次浏览器的请求,了解计网的基本知识。

从一次浏览器的请求,了解计网的基本知识。

Posted by Hzy on December 6, 2019

下面是对计算机网络知识的一些总结与联系(文笔不好,哈哈哈哈!),从浏览器输入url那一刻开始…

同时,我们先看看下面的图,这是我们数据包封装的过程,以及对应的模型层。

下面是一个数据包的穿衣服,脱衣服的故事。


应用层:我是一个数据包,在你输入url按下回车的那一刻我就产生了!现在我要去哪?


1.首先我们在浏览器输入了url,那url是啥呀?

url是统一资源定位符号,指定我们需要的资源在什么位置。

1.1 url由哪些部分组成?

url由[协议名]/[主机ip和端口]/[存放资源的主机路径]/[资源名称]

2. 但我们平时用的不是ip+端口,而是域名,而这就需要了解域名系统了,域名系统:"数据包你请求的资源在xxxIP"

2.1 那什么是DNS域名系统,它的作用是什么呢?

DNS域名系统是一个分布式数据库,它的作用就是帮助我们把ip地址映射成域名,方便我们人类的记忆和使用。

2.2 那那那DNS域名系统是如何工作的, 是如何把域名映射成ip地址的?

我们可以把域名系统可以看成一颗很大的树,就长下面这个样子。

  • 根域名服务器好像一共有13台,记录了所有的顶级域名服务器的ip和地址,听说最近中国也有自己的根域名服务器了!
  • 只要有一台根域名服务器可以正常工作,整个域名系统就不会挂掉,
  • 根域名下会有很多顶级域名。
  • 顶级域名下面,又会有很多二级域名,就这样一层层..有很多的域名。

当然我们本地也有一个域名服务器,有一张域名IP缓存表,帮我们快速找到一些经常使用到的域名所对应的ip,省去解析的过程!

域名解析过程
  • 输入hzeyuan.cn
  • 电脑请求本地的域名服务器,DNS Cache中看看这个域名有没有缓存,在看看本地的host文件,的话就返回ip查询结果。
  • 没有的话,则发送DNS请求 根域名服务器,根域名服务器告诉它,在cn域名服务器下。
  • 电脑跑去问cn域名服务器,cn域名服务器告诉它,在hzeyuan.cn域名服务器下。
  • 然后捏,电脑又屁颠屁颠的去找,hzeyuan.cn域名服务器。
  • 这时,这个域名服务器告诉它,原来你找我啊,然后把ip告诉它,结束。

域名解析的过程就是上面这个样子,所以你能明白缓存的意义了吧,没缓存,你就得问来问去,效率很低!

2.3 明白域名解析过程后,那也得明白其中的安全问题。

1.域名劫持(DNS劫持)

  • 简单说就是在域名解析的过程中,被人作了手脚,返回的ip不在是原来的ip了,而是攻击者修改后的ip。

1.1 方式:

  • 本地DNS Cache 被或hosts文件被改,返回被改过的IP,GG。
  • 本地里找不到,向根域名服务器发送请求,一层层往下找,在这过程中域名服务器被黑了,GG。
  1. 域名污染(域名欺骗)(域名缓存投毒)

2.1 前面说的电脑发送DNS请求,那在真正的请求到来之前,我伪造一个假的DNS应答给你,你当真不就GG了。

  1. 坏处:
    • 结果可能就导致你访问的域名,回来的是一个钓鱼网站。
    • 或者回来的是一个假的ip,让你上不了网。

网络层:现在知道目标ip啦,数据包:”我要怎么走呢?”

ps:(传输层tcp我们在解封数据包的数据在说!,假设现在数据包肚子里已经封装了tcp和http信息啦!)


3. 我们先来了解下ip协议。

3.1 什么是ip?

我们平常看到的IP像这样

  • 171.48.163.10(十进制),
  • 10101011,110000,10100011,1010(二进制)
  • 由32位二进制,一个字节8位,由4个字节组成。
  • 按照字段分可以分为网络号,主机号

然后捏IP按照网络号可以分为5类:

  • A类 (0.0.0.0~127.0.0.0) ,子网掩码: 255.0.0.0
  • B类 (128.0.0.0~191.255.0.0),子网掩码: 255.255.0.0
  • C类 (192.0.0.0~223.255.255.0),子网掩码: 255.255.255.0
  • D类 (224.0.0.0~239.255.255.255)
  • E类 (240.0.0.0~255.255.255.254)

其实就是下面这个图

3.2 那什么是子网掩码?
  • 听名字就知道跟子网有关系!
  • 我们的主机号可以继续细分为子网号主机号
  • 然后我们使用子网掩码来区分,子网号和主机号的位数。
  • 子网掩码中的1对应网络号子网号,0对应主机号,通过给的子网掩码,路由就能知道要分配给哪个子网
3.3 知道子网(内网)和外网,就应该知道什么是网关啦。

网关就是公网和内网之间的关卡,我们通过它与外面Internet相连,通常都是路由器可以完成网关的相关功能,因此我们通常说的网关就是路由器ip地址

3.4 那网关是如何把我们与外面Internet?

通过nat协议:全称 Network Address Translation,网络地址转换。

  • 就是通过这个协议,把我们的内网分配的ip,转换成公网ip,与外界internet通信。
  • 或者把公网ip,转换成内网分配的ip,让我们能收到外界internet的信息。
  • 这样子就可以让许多机器,一个学校,一个公司,就用一个公用ip啦,就可以节省一些公网ip地址!

结论:数据包封装了ip的头部信息,然后来到了网关,网关发现数据包的终点不在本网络,准备放行,但在放行前需要知道,这个网关的MAC地址,于是我们就来到了链路层啦。


4. 链路层:APR协议,数据包想要知道MAC地址,需要通过APR协议才能知道!


4.1 什么是APR协议?

ARP协议:地址解析协议,我们可以通过他来将一个已经知道的ip地址,解析成MAC地址。

4.2 APR协议解析过程

第一种情况:两个ip地址在同一局域网

  • 主机A将请求包,以广播的形式发出,这样在同一局域网里的所有主机都能收到啦。
  • 收到的主机再根据请求包是不是自己的,选择丢弃还是回应。
  • 目标主机B确认发给是自己的,发送一个单播给主机A,这样主机A就知道主机B的MAC地址啦。

第二种情况,两个ip地址不在同一局域网

  • 主机A根据IP可以知道,目标ip是不是和自己在同一网络。
  • 不是一个网络,那想要出关需要啥?当然是网关啦。
  • 主机A就会把网关的MAC地址给带上,由网关(转发)来进行接下来的操作!
  • 接下里就是网关之间的事情啦,网关之间会互相转发,同时也记录每一步的MAC地址,最后找到目标主机B的网关!

单播就是一点对一点的网络通信,广播就是一点对多点的网络通信。

4.3 APR缓存表

DNS有缓存表,APR肯定也有啊,不然每次都要查询多浪费啊。

  • 缓存表中记录了 常用的ip地址对应的MAC地址
  • 当然缓存表中的记录是有时效的,一般为20分钟。

4.4 ARP包分析

直接贴图了

  • 以太网目的地址=接收方地址: 请求时,ff-ff-ff-ff-ff-ff 为广播,返回时单播。
  • 以太网原地址=发送方地址。

4.5 ARP协议常见的攻击

4.5.1 中间人攻击

啥叫中间人攻击

简单说,就是中间商坑人,既能坑卖家(发送方),也能坑买家(接收方),信息不对称。

  • 发送方的ARP包,被坏蛋的机器劫了,因为坏蛋的主机,跟发送方说,我就是你要发送的目的地。
  • 发送方,一脸懵逼,居然收到两个回复(不是应该只有一个吗),然后选了一个最新的回复。
  • 结果呢,发送方的ARP缓存表会记录坏蛋的主机的MAC地址,然后发送给他…

中间人攻击的影响 ?

  • 一些明文,敏感信息被窃取。
  • 可能导致断网,或者限速了,因为你的包经过了坏蛋的机器,它可以选择丢弃,或者进行一些处理。

5.现在网关放行啦,数据包就上路了,一路飞奔,来到目的地的网关!目的地的网关一看,地址没毛病,放行!接下来同样的,链路层,然后来到了网络层

ps:到达目的地,接下来就是解封包的过程!


在传输层经常会遇到的两种协议,TCP和UDP,我们先来了解TCP协议。

5.1 什么是TCP协议,UDP协议?

TCP协议全称:(Transmission Control Protocol) 传输控制协议。 UDP协议全称:(User Datagram Protocol) 用户数据包协议

5.2 UDP协议和TCP协议的区别(不同点)?

  • 可靠性指的是:TCP协议中有专门的传递保证机制,但UDP协议不会。
  • 连接性指的是:TCP协议会建立一个双方的通信通道,但UDP协议不会。
  • 字节流和报文的区别:

TCP中的字节流:TCP中有一个发送缓冲区,数据流太长会切割成合适的长度发送。数据流太短,则等待缓冲到适合的长度在发送。且只有对方收到后才会发缓冲区中的数据删除。

UDP中的报文:UDP中的报文,不会拆分,也不会合并,一次性发送一个报文。

  • 效率:TCP协议效率低,因为需要保证传输的可靠性,但UDP协议不用,只尽可能的传输。
  • 双工:tcp协议中是双向的。UDP协议中,可以是双向的,也可以是一对多,或者多对多,因为UDP协议不用建立连接。

5.3 TCP数据包和UDP数据包的区别

TCP报文结构

UDP报文结构

观察后你就会发现

  • 1.tcp包头部比udp头部长,一个为20字节,一个为8字节!!! udp包更省空间。
  • 2.tcp包里面比udp多了好多东西!
  • 序号(seq):每一个tcp都有自己的编号,这样就有顺序啦
  • 确认号:就是确认下一次发送包的序号,在ACK标志为1的时候有效,通常:确认号=序号+1。
    1. SYN:建立连接的标志
    1. ACK:确认标志位,就是刚刚确认号为1有效的标志。
    1. FIN:释放连接的标志。
  • tcp和udp中都有检验和,但在tcp中检验和是必须的,所以呢你会看到一个伪首部
  • 但在UDP中检验不是必须的!

5.4 TCP协议是如何建立连接的?(三次握手)

三次握手,图解http

1.发送端:发送一个tcp包。

  • 其中:标志位SYN=1,表示建立连接

2.接收端,收到一个tcp包。准备返回一个数据包。

  • 其中这个数据包中 标志位ACK和SYN都为1,为什么呢?
  • ACK=1,表示收到上面发送端发送过来的包
  • SYN=1,表示接受端准备和发送端建立连接。
  • 这两种情况以同一个数据包返回!

3.发送端:收到:接受端发送过来的包(SYN/ACK)

  • 这时,发送端就知道,接受端已经收到刚刚自己发送的包啦!
  • 同时,发送端,还得告诉接收端,你发给我的包,我也收到啦!

这时候双方都确认了对方的通信和接受能力,就可以建立连接啦!

5.3 为什么需要三次握手而不是两次?

因为只有三次双方才都能确认对方与自己的接受能力是正常的!

5.4 TCP释放(终止)连接(四次挥手)

四次挥手

1.假设客户端为主动方。客户端首先发送一个报文。

  • 此时,客户端进入FIN_WAIT_1状态
  • 其中标志位FIN=1,表示我准备要断开连接啦,我没啥数据要发给你的!
  • Ack=Z,表示:下一个想要收到的包的序列号为Z
  • Seq,表示:这个包的序列号。

2.服务器端收到包,就知道客户端已经准备断开客户端到服务端的连接

  • 服务端到客户端的连接还没有断开。(这时候可能服务端还有要给客户端发送的数据!)
  • 服务端发送一个数据包(ACK=1),表示:客户端,我知道啦,你断开就断开吧!
  • 此时,客户端进入FIN_WAIT_2状态

3.等服务端没有数据要发送时,服务端也准备断开连接了。

  • 会在发送一个报文(标志位FIN=1),给客户端。
  • 表示,我也想要断开连接啦!
  • 此时,服务端进入LAST_ACK状态

4.客户端确认收到报文后。

  • 此时,客户端进入TIME_WAIT状态
  • 客户端等待一段时间,发现没有收到任何回复,就断开连接啦。

5.5 为什么挥手需要四次,而握手只需要三次呢?

仔细看三次握手会发现在第二次握手时:

  • 服务端返回的报文是(SYN+ACK) 但在四次挥手中,在第二挥手和第三次挥手中:
  • 服务端第二次挥手:发送的是ACK报文,表示收到来自客户端的报文。
  • 服务端第三次挥手:发送的是FIN报文,表示可以断开连接。

区别就在这,挥手时服务端可能还有数据需要发送给客户端,所以不能立刻断开连接!但握手时,不需要这样,只需要确认发送和接受功能正常就OK啦。

  • 于是呢服务端,先告诉客户端,我收到你的消息啦。
  • 等服务端想断开时,在去通知客户端!

5.6 为什么最后挥手的时候,客户端需要等待一段时间在断开呢?

因为客户端必须确认服务端已经收到自己发送的报文,才能放心的断开连接!

  • 假设客户端不等待,直接断开连接,如果服务端没有收到来自客户端的报文,服务端,会重新不停的发送FIN报文…
  • 所以呢,如果客户端等待一段时间又收到来自己服务端的FIN报文,说明刚刚的报文服务端没有收到。会重新发送一个ACK报文。

5.7 什么SYN攻击?

5.7.1 首先知道什么是半连接

发生在TCP第三次握手之前的过程称为半连接。

  • SYN攻击就是发生在半连接中。

SYN攻击就是伪造大量不存在的ip,向服务器发送SYN报文。

  • 服务器很蠢,不知道这些ip是伪造的,会一直回复直至超时!
  • 伪造的SYN包会长时间占用未连接队列,导致正常的请求被丢弃!
  • 结果就会造成服务器负担过重而宕机或者处理速度很慢!

5.8 TCP协议是如何保证可靠传输的?

  • 1.TCP是面向字节流的,包会按照切割或者合并成合适的大小在发送。
  • 2.TCP发送的包会进行编号,是有序的。
  • 3.校验和,会按照一定的算法,检验报文是否遭到了改动,发生变化,选择是否丢弃这个报文。
  • 4.TCP会丢掉重复的数据,根据序列号。
  • 5.TCP为了保证可靠性,每发送一个分组,就会停止确认对方收到后才继续发送!但是如果对方一直不回复呢?
  • 6.发送方会有一个计时器,当超时就会重新发送刚刚没有收到回复的分组!这就是超时重传!但这样效率好像不太高,那还有什么其他办法呢?
  • 7.每次都要发送一个包都要确认太麻烦啦,于是就有了发送一个次连续发送多个分组,接受方只要确认最新的分组,就默认前面的分组都收到啦!这就是ARQ协议,这样的缺点就是前面的分组要是丢了呢!那就又变成了超时重传了。
  • 8.快重传和快恢复:当丢包的时候呢,发送方是不知道的,但接受方是知道的,因为受到了不连续的分组,于是呢,他就会重复发送同一个(序号)确认,试图告诉发送方,你丢包啦!发送看到后就会重新发送这个分组,这就是快重传,接受方收到后,在把不连续的分组,使其有序,这就是快恢复

6.网络层过后就是传输层啦,但我们已经知道了传输层中的UDP和TCP,现在要了解下应用层中的http协议,也是我们最近常接触到的。


6.1 什么是http协议?

http协议(超文本传输协议),基于TCP/IP来传递数据。

  • 是一种无状态协议,想要管理状态就需要使用Cookie。

简单说http的历程

  • http/0.9,简单的传输html,只有get。
  • http/1.0,正式版,默认短连接,有了post,head,请求有版本和头部,响应有状态和头部,可以传输不html,text,图片等更多的类型。
  • http/1.1 默认长连接,可以同时开多了tcp连接,有了更多的缓存策略。
  • 谷歌研发的SPDY协议,优化了http/1.1的一些缺点,请求有优先级,可以让页面优先显示出来,采用多路复用的技术,压缩头部,降低延迟。

6.2 http报文格式?

http报文可以分两类,请求报文响应报文.

请求报文

  • 请求行,请求首部,空行,报文主体

响应报文

  • 响应行,响应首部,空行,报文主体

列举一些常见的请求头字段

  • Accept :浏览器接受的MIME类型
  • Accept-Encoding: 支持的编码
  • Accept-Language: 最好是xxx语言
  • Content-Length: 主体内容长度
  • Connection:是否持久连接(Keep-Alive)
  • User-Agent:浏览器信息

    F12可以慢慢看。

6.3 常见的状态码,请求方法。

常见状态码,1到5,共5种。

  • 1xx 信息性状态码
  • 2xx 成功状态码,最常见的200。
  • 3xx 重定向状态码,常见的302临时重定向。
  • 4xx 客户端错误状态码,常见的404,找不到网页,400 请求错误。
  • 5xx 服务器错误状态码 常见的500,服务器代码有bug,请求发生错误。

常见的请求方法

  • get ,获取资源
  • post ,向服务器传输数据请求处理,像表单这些。
  • put 也是想服务器传输数据请求处理,但是将资源完全替换。
  • head ,请求报文头部。
  • delete,删除某个资源(URI)。

6.5 什么是长连接(持久连接),什么是短连接。

http长连接可以看成tcp(长连接),http1.0默认为长连接。

  • 建立连接 — 传输数据 - 断开连接 … 建立连接 - 传输数据 -断开连接.
  • 传一数据就断开连接,每次都要建立断开连接,显得有点浪费时间。
  • 双方需要频繁操作的时候,像数据库的连接。

http长连接可以看成tcp(长连接),http1.1默认为长连接。

  • 建立连接 - 传输数据 … (保持连接) … 断开连接
  • 维持连接保持数据传输,但太多的连接会给服务器造成太大压力。
  • 用户很多,不同频繁操作的时候。

6.6 https和http的区别?

https就是在http的基础上,加入了安全套接层。加密数据,不在是明文传输!

6.7 https是如何加密的?

得先知道什么是对称加密:就是你我都共用一把钥匙开门解锁。

非对称加密: 公钥加密,只有私钥能解开,同样私钥加密公钥可以解开。

啥是CA? ,CA就是证书授权中心,第一个第三方机构。他发给你的证书叫CA证书。证书里面有你的基本信息和公钥。

那啥事数字摘要?就是把一串明文,用hash加密成固定长度的密文,稍微改动结果就会大不一样。

那啥是数字签名?,都说是签名了,CA在数字摘要上,用自己的私钥加密,叫数字签名。

那啥叫数字证书?数字证书 = 数字签名+原始信息。

加密过程,先非对称加密对称加密传输。

  • 客户端发送请求。
  • 服务端返回数字证书。如何保证途中的数字证书没被改过,就是上面的数字签名的作用了。
  • 客户端用CA验证证书,看是否被篡改了。
  • ok,数字证书没问题。客户端随机生成一个秘钥,用公钥进行加密
  • 服务端收到后,用自己的私钥解密,得到秘钥!
  • 然后双方就这个对称秘钥进行通信。

具体为什么需要这么多这些,签名啊,摘要啊,都是为了保证传输时的可靠,具体原因可以看下面的文章。


7.总结


  1. 客户端到服务器,一个个数据包,自顶向下:层层封装,在底向上:层层解封,就这样完成了一次次传递。

  2. 网络中的每层模型都有对应的作用,同时,每个协议都有自己出现的背景及原因,以及设计时存在的一些漏洞。

  3. 对自己所学的计网的知识进行了一些梳理和总结,有一个大概的轮廓。当然还有好多协议,还需日后细细的研究。

如果有什么说的不对的地方,或者需要改进的地方可以告诉我!感谢阅读

参考文章