前端开发中关于网络的那些事儿--基础篇

网络在前端开发中的重要性是不言而喻的(感觉说了句废话,网络在哪块儿开发中不重要啊^-^,原谅我吧,真的不知道怎么开篇了),最近刚好学到这块,就把了解到的知识点总结一下吧.
整篇文章还是从一道经典的面试题’从输入地址到返回请求,发生了什么’切入,其中涉及到相关知识点又再展开.(ps:作为一个前端萌新,整个梳理的过程及涉及的知识点较为浅薄,如果其中有哪些不正确的见解,也希望大家指正哈)
so,进入正题啦…

输入地址到返回请求中的大致流程


画了一张简图(真的很简…).结合这张图可以看到,当我们输入域名后,先是通过DNS,即域名系统来解析这个域名,获取对应的IP地址.然后将请求通过HTTP协议打包,然后通过逻辑网络和物理网络传输,到达服务器后再相应的拆包,然后后台处理.而后台返回数据,则是原路返回.
单是上面一段话,其中就涉及到很多概念了.现在一一展开下.

DNS

DNS,即Domian name system,域名系统.

  • 机器之所以在处理IP数据报时用IP地址而不是域名,是因为IP地址的长度是固定的32位(Ipv6地址则是128位),是定长的,机器处理起来相对容易.
    DNS被设计成为一个联机分布式数据库系统,采用客户-服务器方式.大多数都在本地解析,所以效率很高.
  • 域名结构通常是 三级域名.二级域名.顶级域名
  • 域名到IP地址的解析是由因特网的许多域名服务器共同完成的.
  • 域名服务器分为以下四种类型:
    • 根域名服务器 : 不算是哪一个本地域名服务器,只要自己无法解析,首先求助于根域名服务器.目前共有13组不同IP地址的根域名服务器.很多情况下,根域名服务器不会直接返回IP地址,它也没有存放这类信息,而是返回下一个该查询的服务器地址.
    • 顶级域名服务器
    • 权限域名服务器 : 也就是负责一个’区’的域名服务器
    • 本地域名服务器 : 我们在电脑上查看dns选项时,所指的DNS服务器就是本地域名服务器.
  • 应用程序调用解析程序,并成为DNS的一个客户,把需要解析的域名放在DNS请求报文中,以UDP数据报的方式发给本地域名服务器,待查到后,再将IP地址放在回答报文中返回.
  • 查询方式有2种:
    • 迭代查询 : 本地域名服务器向根域名服务器查询时通常采用它.它要么直接给出IP地址,要么是告诉本地域名服务器下一步应向谁查询,而不是代替本地去查询.
    • 递归查询 :主机向本地域名服务器查询通常采用它.它是如果本地查询不到,则以DNS客户身份向其他域名服务器查询,所以递归查询的结果,要么是IP地址,要么表示无法查询到.
  • 为了提高DNS查询效率,减少网络DNS查询报文数及域名服务器的负荷,现在都采用高速缓存.即存放最近查询过的域名及从何处获得的域名映射.

网络体系结构

1.应用层 : 定义应用程序间通信和交互的规则. 常见的应用层协议有HTTP,FTP,SMTP,POP3,DNS.
2.传输层 : 向两个主机中进程间的通信提供数据传输服务.应用层利用该服务传送应用层报文.主要使用2种协议:

  • TCP(transmission control protocal):
    • 面向连接的,可靠的.
    • 数据传输单位是报文段segment.
    • 允许通信双方在任何时刻发送数据.
  • UDP(user datagram protocal):
    • 无连接的,所以减少了开销及时延.
    • 不保证可靠性,相应的速度要快一些.传输单位是用户数据报.
    • 没有拥塞控制,所以网络出现的拥塞不会使主机发送速率降低,可以在对其不可靠传输改进后用于某些实时应用.
    • 支持一对一,一对多,多对多交互通信

3.网络层 : 选择合适的路由,是传下来的分组能够通过路由找到目的主机.这层会将传输层产生的报文段封装成分组或包packet.

TCP协议中的3次握手,4次挥手

建立连接的过程:

之所以要client端多发送一次确认,是为了防止已失效的连接请求报文又传送到了server端.
假设先前传了一次连接请求,但因为网络问题,迟到了一会儿,这期间又传了一起请求连接,且数据已经传完.如果没有多一次的确认,这时server会以为这延时到的请求是客户端新提的,然后建立连接.但客户端已经接受完数据了,因此并不会再发送数据,那这一条连接就浪费了.

连接释放的过程:

client在时间等待状态等待2MSL,是因为两个原因.
1 为了保证它发送的最后一个ACK报文段能到达server端. 这个报文段可能丢失,服务器端收不到确认,会超时重传,客户端就可以在这个时间内重传一次确认,使两者都进入正常的closed状态.
2 防止之前提到的’已失效连接请求报文段’出现在这次连接中.客户端在发送完最后一个确认之后,再经过2msl,就可以使本次连接中所产生的所有报文段从网络中消失.

server端在收到确认后,就进入closed状态,然后撤销TCB,结束这次连接.它结束连接的时间要比client端早.

HTTP协议

  • http使用了面向连接的tcp作为传输层协议,保证了数据的可靠传输.但http协议本身是无连接的,也就是说,通信双方不需要建立http连接.
  • http也是无状态的.即,服务器并不会记得曾经访问过的用户.这样简化了服务区的设计,使其能更容易支持大量并发http请求.
  • 请求一个文档所需要的时间是文档传输时间加上2倍往返时间RTT,而http/1.0的缺点在于非持续连接,即每次连接都会导致2倍RTT.http/1.1则解决了这个问题,它使得服务器在响应后仍然保留这条连接.
  • http的报文结构:

    • 请求报文 :

    这里特别提一下方法,方法其实就是对所请求对象的操作.
    常见的如下几种,

方法意义
GET请求读取URL标志的信息
POST向服务器添加信息
OPTION请求一些选项的信息
HEAD请求读取URL标志的信息的头部
DELETE删除URL标志的信息
PUT向URL标志的信息下存储一个文档
TRACE用来进行环回测试的请求报文
CONNECT用于代理服务器
  • 响应报文:

    常见的状态码:

  • 1xx : 表示通知信息,表示请求收到或正在处理.
  • 2xx : 表示成功. 像200.
  • 3xx :表示重定向,如要完成请求还需下一步行动. 301是永久转移,302是临时转移.304 与缓存有关.
  • 4xx :表示客户端的差错.400 错误的请求,404 not found.

    更多的关于状态码具体意义,可以参考下这个文档
    这里要特别说下浏览器的缓存,特别特别重要,加粗啊!

    浏览器缓存

    与缓存相关的头字段:

    • expires : 是一个绝对时间.
    • cache-control :max-age=3600. 是相对时间.它的优先级高于expires.
    • last-modified : 文件最后修改时间.

    缓存的流程:

    在第一次请求回应的头部中,通过cache-control说明文件20s后过期,同时定义了文件最后修改时间. 10s时,请求文件时,直接从缓存中读取内容,这是属于强缓存. 当21s时,缓存时间过期了,此时又一次请求,请求头部中的if-modified-since与起初响应头部的last-modified相同,若文件没有改动,则返回304和一个空的响应,让浏览器继续使用本地缓存.若改动了,则是一次全新的内容响应了,则返回200.这时的缓存是协商缓存.
    这里有一点要注意的是,有时只是文件的时间改变了,内容没有改变,那它也不应该作为新的资源返回.这时可以通过头部的Etag和if-none-match来判断.

不知不觉写了这么些了,整篇文章更像是对基本网络知识的一个回顾总结,整个写的过程中,一边抱着<计算机网络>相应的章节读了一篇,又再回头来记录,写完感觉是把已还给老师的网络知识又拿回来一丢丢(囧~).
希望能对才接触网络或忘了一些基础的小伙伴们有一些帮助.越看书越觉得不懂的好多啊,也希望自己能继续深入,尽快达到写进阶篇的阶段吧.加油 !

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值