【专题】网络基础知识

2018-06-06  本文已影响15人  都有米

1、分层

2、http基础知识

HTTP消息报头包括普通报头、请求报头、响应报头、实体报头。

  1. Last-Modified 和 If-Modified-Since
Response:
  Last-Modified:Tue, 24 Feb 2009 08:01:04 GMT
Request:
  If-Modified-Since:Tue, 24 Feb 2009 08:01:04 GMT
  1. Etag 和 If-None-Match
Response:
  Etag:“5d8c72a5edda8d6a:3239″
Request:
  If-None-Match:“5d8c72a5edda8d6a:3239″

Etag和Last-Modified类似,但是有所不同的是Last-Modified和IF-MODIFIED-SINCE只判断资源的最后修改时间,而ETags和If-None-Match可以是资源任何的任何属性,比如资源的MD5等。

  1. Cache-Control 和 Expires
Cache-Control: max-age=秒 HTTP 1.1版本,资源在本地缓存多少秒。
Expires HTTP 1.0 版本,缓存的载止时间,允许客户端在这个时间之前不去检查(发请求)

如果max-age和Expires同时存在,则被Cache-Control的max-age覆盖。Expires =max-age + “每次下载时的当前的request时间”,所以一旦重新下载的页面后,expires就重新计算一次,但last-modified不会变化 。

last-modified 在资源没有改变时可以节省一点流量,但是还是会发送一次http请求。Expires允许在缓存截止时间前不发送http请求。

Expires 的一个缺点就是,返回的到期时间是服务器端的时间,这样存在一个问题,如果客户端的时间与服务器的时间相差很大,那么误差就很大,所以在HTTP 1.1版开始,使用Cache-Control: max-age=秒替代。

3、https原理

HTTPS就是http+ssl。服务端传递非对称加密的公钥到客户端(数字证书),客户端用公钥加密对称加密使用的秘钥然后传给服务端,然后客户端和服务端均使用对称加密传输数据。

SSL层

SSL工作原理

握手协议(Handshake protocol):握手协议是在应用程序的数据传输之前使用的。该协议允许服务器和客户机相互验证,协商加密和MAC算法以及保密密钥。证书验证是在握手阶段完成。

记录协议(Record protocol):记录协议在客户机和服务器握手成功后使用。该协议两个作用:1、使用握手协议定义的秘密密钥实现消息的保密性(加密);2、使用握手协议定义了MAC保证消息的完整性(散列算法)。

警报协议(Alert protocol):客户机和服务器发现错误时,向对方发送一个警报消息。如果是致命错误,则算法立即关闭SSL连接,双方还会先删除相关的会话号,秘密和密钥。每个警报消息共2个字节,第1个字节表示错误类型,如果是警报,则值为1,如果是致命错误,则值为2;第2个字节制定实际错误类型。

https.png

数字证书

握手过程中涉及到两种证书

用户证书的内容是通过CA证书的私钥加密的,服务端传到客户端后使用客户端CA证书中公钥解密,然后验证用户证书中的信息,如核对访问的域名和证书中的域名是否一致,证书是否过期,获取服务端公钥等

客户端所在设备保存的证书来源

4、DNS(Domain Name System)解析

网站的域名和ip就好比是人的名字和地址。要找到某个人,我们得通过人名在地址簿上找到他的地址,同样我们要访问某个网站就得先把域名换成ip地址,这个DNS服务器就是网络世界的地址簿。

DNS服务器树状层级结构 DNS解析过程

第1步,查找浏览器缓存。

浏览器会检查缓存中有没有这个域名对应的解析过的IP地址,如果缓存中有,这个解析过程就将结束。浏览器缓存域名也是有限制的,不仅浏览器缓存大小有限制,而且缓存的时间也有限制,通常情况下为几分钟到几小时不等。这个缓存时间太长和太短都不好,如果缓存时间太长,一旦域名被解析到的IP有变化,会导致被客户端缓存的域名无法解析到变化后的IP地址,以致该域名不能正常解析,这段时间内有可能会有一部分用户无法访问网站。如果时间设置太短,会导致用户每次访问网站都要重新解析一次域名。

第2步,查找系统缓存。

如果用户的浏览器缓存中没有,浏览器会查找操作系统缓存中是否有这个域名对应的DNS解析结果。其实操作系统也会有一个域名解析的过程,在Windows中可以通过C:\Windows\System32\drivers\etc\hosts文件来设置,你可以将任何域名解析到任何能够访问的IP地址。如果你在这里指定了一个域名对应的IP地址,那么浏览器会首先使用这个IP地址。例如,我们在测试时可以将一个域名解析到一台测试服务器上,这样不用修改任何代码就能测试到单独服务器上的代码的业务逻辑是否正确。正是因为有这种本地DNS解析的规程,所以黑客就有可能通过修改你的域名解析来把特定的域名解析到它指定的IP地址上,导致这些域名被劫持。

第3步,查找路由器缓存。

如果系统缓存中也找不到,那么查询请求就会发向路由器,它一般会有自己的DNS缓存。

第4步,查找ISP DNS 缓存。

运气实在不好,就只能查询ISP DNS 缓存服务器了。在我们的网络配置中都会有"DNS服务器地址"这一项,操作系统会把这个域名发送给这里设置的DNS,也就是本地区的域名服务器,通常是提供给你接入互联网的应用提供商。这个专门的域名解析服务器性能都会很好,它们一般都会缓存域名解析结果,当然缓存时间是受域名的失效时间控制的,一般缓存空间不是影响域名失效的主要因素。大约80%的域名解析都到这里就已经完成了,所以ISP DNS主要承担了域名的解析工作。

第5步,递归搜索。

最无奈的情况发生了, 在前面都没有办法命中的DNS缓存的情况下,
(1)本地 DNS服务器即将该请求转发到互联网上的根域(即一个完整域名最后面的那个点,通常省略不写)。
(2)根域将所要查询域名中的顶级域的服务器IP地址返回到本地DNS。
(3) 本地DNS根据返回的IP地址,再向顶级域(就是com域)发送请求。
(4) com域服务器再将域名中的二级域的IP地址返回给本地DNS。
(5) 本地DNS再向二级域发送请求进行查询。
(6) 之后不断重复这样的过程,直到本地DNS服务器得到最终的查询结果,并返回到主机。这时候主机才能通过域名访问该网站。

权威DNS: 处于DNS服务端的一套系统,该系统保存了相应域名的权威信息。权威DNS即通俗上“这个域名我说了算”的服务器。

5、TCP/IP基础知识

tcp如何保证传输可靠性?(接收方确认、超时重复) tcp将所发送的数据都序号标记,接收方收到数据后会发送一个确认(ACK)给发送方。发送方给每个发送都保留一个计时器,若计时器超时还没有收到确认,就会重新发送数据。

IP数据包 TCP数据包

S:SYN位 A: ACK位 数据序号:seq 确认序号:ack

A请求连接B的三次握手

  1. (A) –> [SYN] –> (B) A首先向B发一个SYN (Synchronize) 标记的包,告诉B请求建立连接. 注意: 一个 SYN包就是仅SYN标记设为1的TCP包. 以一个随机数初始化A的seq,这里假设为10000,此时ACK=0
  2. (A) <– [SYN/ACK] <–(B) B收到后会发一个对SYN包的确认包(SYN/ACK)回去,表示对第一个SYN包的确认,并继续握手操作. 注意: SYN/ACK包是仅SYN 和 ACK 标记为1的包.B收到A的连接请求后,也以一个随机数初始化B的seq,这里假设为20000,意思是:你的请求我已收到,我这方的数据流就从这个数开始。B的ack是A的seq加1,即10000+1=10001
  3. (A) –> [ACK] –> (B) B收到SYN/ACK 包,B发一个确认包(ACK),通知A连接已建立。 A收到B的回复后,它的seq是它的上个请求的seq加1,即10000+1=10001,意思也是:你的回复我收到了,我这方的数据流就从这个数开始。A此时的ack是B的seq加1,即20000+1=20001
TCP三次握手 TCP四次挥手

为什么连接的时候是三次握手,关闭的时候却是四次握手?
答:因为当Server端收到Client端的SYN连接请求报文后,可以直接发送SYN+ACK报文。其中ACK报文是用来应答的,SYN报文是用来同步的。但是关闭连接时,当Server端收到FIN报文时,很可能并不会立即关闭SOCKET,所以只能先回复一个ACK报文,告诉Client端,"你发的FIN报文我收到了"。只有等到我Server端所有的报文都发送完了,我才能发送FIN报文,因此不能一起发送。故需要四步握手。

根据通信双方的分工和信号传输方向可将通信分为三种方式:单工、半双工与全双工。

流量控制

接受方发送rwnd接收窗口,发送方按接受窗口值来发送数据。

拥塞控制

发送方的 Window 大小称之为 cwnd(congestion window)拥塞窗口,接收方的 Window 大小称之为 rwnd(receiver window,或者 advertised window)接受窗口。cwnd 表示当前发送方可以发送多少个 TCP 包,而 RWND 表示当前接收方还能接收多少个 TCP 包。一般实际发送数据包个数是min(rwnd,cwnd) TCP使用了一个叫慢启动门限(ssthresh)的变量。

拥塞控制算法

1. 慢启动(Slow start):cwnd = 1,收到一个ACK包,cwnd翻倍。

2. 拥塞避免(Congestion avoidance):cwnd大于ssthresh后,收到一个ACK包,cwnd+1。ssthresh一般默认65536,4个字节最大值。

数据重传策略

数据重传:发送方计时器超时,说明网络差,cwnd=1,ssthresh减为cwnd的一半,重新开始慢启动。

快速重传(Fast retransmit):接收方在收到乱序到达包时立刻发送ACK确认。发送方收到三个重复确认就重传数据,不用等待计时器超时了。“快速恢复(Fast Recovery)”:收到三个重复确认就ssthresh减为cwnd半,cwnd窗口设置成ssthresh+3,执行拥塞避免算法。

上一篇下一篇

猜你喜欢

热点阅读