前后端都应掌握的网络基础扫盲

网络基础扫盲

通过本文将一些前后端常见的网络基础知识串起来,知道它们为何出现/解决什么问题,标红字体即为知识点。

对于非科班出身的程序员来说,面试遇到最头疼的问题之一就是网络基础,比如你肯定遇到过下面的问题:

  • HTTP协议
  • TCP/UDP
  • OSI 模型
  • HTTP/HTTPS/HTTP2
  • SSL/TLS
  • socket
  • cors/跨域
  • 状态码
  • cookie
  • request/response


死记硬背非常难搞懂,很快就会忘,我们应该把这些知识点串起来,这些术语的出现解决了哪些问题?

HTTP协议 是超文本传输协议,我们在学HTML的时候也知道它是超文本标记语言,所以我们可以理解为HTTP就是为了在客户端和服务端之间传输HTML。它的特点就是简单快速灵活, 无连接,无状态 。前面的不用管,当是客套话。而无连接,无状态是HTTP协议本身的特点。

假如我浏览器登录,关掉窗口再打开是不是又得登录,因为它本身无状态。为了解决这个问题,出现了 cookie/JWT 等请求头来标记这种状态。在Server端验证过之后自动登录。

无连接并不是说没有连接,而是每次请求只有一次连接,得到响应之后断开连接,我们知道每次连接会经历TCP“三次握手”,这样会很消耗性能,所以在http1.0时使用 connection: keep-alive (HTTP持久连接) 来保持连接不被断开。

像我们常见到的 HTTP/1.0/1.1/2 这些都是HTTP协议的版本号,推陈出新嘛,自然会有区别的。
HTTP/0.9 只支持GET请求 弃用
HTTP/1.0 第一个在通讯中指定版本号的HTTP协议版本,至今还在用
HTTP/1.1 默认采用持久连接(就是刚才说的keep-alive),相比1.0改善/新增了 缓存处理、带宽优化、错误通知等
HTTP/2.0 当前版本,2015年5月发布,区别不细说,自己看HTTP/2.0

HTTPS 与HTTP之间的关系, HTTPS = HTTP + SSL/TLS,因为HTTP是明文传输,被认为不安全。所以加了SSL协议以使它的传输获得加密传输,身份认证的特性。

这里再说下 SSL和TLS ,TLS是传输层安全协议,它的前身就是SSL(安全套接层协议),作为安全协议,SSL版本也是经历了1.0->2.0->3.0 最终被IETF组织标准化,将其称为TLS,所以TLS1.0和SSL3.0的差异非常小,之后对TLS的更新主要在于安全算法,防攻击层面。这里不展开讨论,自己看SSL/TLS

OK, 到了 TCP和UDP , 这俩又是干嘛的?TCP即传输控制协议,它用三次握手来实现一次连接,HTTP就是基于它来实现传输的;UDP是用户数据报协议,它只提供数据的不可靠传递,特点就是速度快,只管连接,不管你丢不丢包,数据是否完整。比如我们判断网是不是挂了用的 ping xx.com 命令就是基于UDP协议的。

值得一提的是,在TCP“三次握手的过程中”,第一步就是一端打开通道然后监听另一端的连接,这个通道的打开方式就是 socket

HTTP连接了客户端和服务端进行传输,我们把客户端的请求报文信息叫 request , 服务端的响应信息叫 response
形式是这样的:

GET /resources/public-data/ HTTP/1.1
Host: bar.other
User-Agent: Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10.5; en-US; rv:1.9.1b3pre) Gecko/20081130 Minefield/3.1b3pre
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-us,en;q=0.5
Accept-Encoding: gzip,deflate
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
Connection: keep-alive
Referer: http://foo.example/examples/access-control/simpleXSInvocation.html
Origin: http://foo.example


HTTP/1.1 200 OK
Date: Mon, 01 Dec 2008 00:23:53 GMT
Server: Apache/2.0.61 
Access-Control-Allow-Origin: *
Keep-Alive: timeout=2, max=100
Connection: Keep-Alive
Transfer-Encoding: chunked
Content-Type: application/xml

前10行请求报文,后面的是响应报文
第13行 1.1是协议版本,响应状态。响应状态一般有 状态码 相对应,

说到状态码我们来看看常用的 2x、3x、4x、5x开头的,多的不记,没必要。

image.png

跨域的出现是由于浏览器与服务器不同源,同源即协议域名端口任意一个不同,解决方案有 JSONP
CORS (跨域资源共享),CORS是一种机制,怎么实现呢?

就是用额外的http头来告诉浏览器,相同的origin准许在不同服务器上被访问。在Server端响应头设置 “accept-control-allow-origin”,这一连串单词理解下意思,就是准许哪些源通过访问控制。其实关于这块一定要看看官方说明,推荐MDN

JSONP 原理是利用script标签的开放策略,使用src属性从指定站点‘要’数据,然后会执行src属性后拼接的callback函数,得到的是一段JavaScript片段。

<script type="text/javascript"
         src="http://server2.example.com/RetrieveUser?UserId=1823&jsonp=parseResponse">
 </script>

这段代码会在 script 获取到数据后被填充(padding)到 parseResponse 方法, 这就是JSONP的由来。

最后,回到OSI模型,为啥会有这么个模型呢,计算机网络体系过于复杂,我们碰到复杂的事都会给它分步骤,分模块,为了便于理解计算机网络,也给它分了这样一个模型,一共有7层,每一层都对应一系列操作。

记个口诀:应表会传网数物,分别对应自上而下7层, 第一层物理层在最下面
即物理层、数据链路层,网络层、传输层、会话层、表达层、应用层。

各层干嘛的不用死记硬背,慢慢来(以前背过也忘了),随着业务的深入和反过来回顾基础,我就记住了 http,https,smtp等是在应用层,tcp是传输层。

发布了171 篇原创文章 · 获赞 246 · 访问量 24万+

猜你喜欢

转载自blog.csdn.net/weixin_42042680/article/details/105052878