网络01 网络基础、客户端请求网络资源过程剖析

1.网络基础知识:

网络七层协议:应用层拆分为:应用层->表示层->会话层;表示层、会话层没有相应的协议,表示层常用来做数据格式化/加密等操作

协议:本质便是套着特殊格式的数据,最终数据到达的时候,需要将一层层包裹的协议拆开,然后才能拿到里面的数据(最终拿到的数据是去掉应用层协议的数据)

TCP/IP:稳定传输;UDP:容易丢包,强调实时性

A -> B: 数据传输过程中从A处的应用层、运输层、网络层、数据链路层、物理层将数据运送到B处,然后沿着物理层、数据链路层、网络层、运输层到应用层;(数据送达的过程中,协议也是一层层去掉的,三次握手/四次挥手遵循的是TCP/IP协议,三次握手会经过传输层网络层数据链路层,四次挥手开始的时候在传输层)

2.客户端请求网络资源过程剖析:(用户在URL地址栏输入域名访问网页过程剖析)

(1).过程综述:用户 -> URL地址栏 -> 输入域名 -> DNS解析出服务器IP地址 -> client发送http请求  ->TCP连接(三次握手)  -> 连接成功后 -> client端向server端发送HTTP协议包(请求资源) -> server端向client端发送HTTP协议应答包(发送资源) -> client端和服务器端断开(四次挥手) -> client端拿到资源后渲染页面(渲染过程:请求到资源后开始解析document文档;html/css/js(各自相对应的引擎解析),过程遵循js时间线,解析形成dom树,css树,两者拼接形成renderTree,渲染引擎根据renderTree渲染页面(布局+绘制),最终呈现给用户);

 - - - - - - - - -  >>> 详细过程描述:

(2).URL: https://www.baidu.com/s?wd=URL地址栏分&rsv_spt=1&f=8&rsv_bp=1& ;  

http/https:协议名(https协议在http协议上加SSL的安全层(加密),可以理解为http协议的安全版本)

www.baidu.com:域名;/s:路径;?:参数;

https://www.baidu.com/443; http://www.baidu.com/80;  端口号:https为443,http为80,两者端口号可隐藏,但是如果是其他端口:8080,8000,3000,80,90等则不可隐藏(不同端口提供不同的服务)

(3).DNS解析过程:dns客户端将域名www.baidu.com发送给服务器端,dns服务器端解析域名(倒着解析)成IP地址,然后将IP地址发送给客户端,客户端拿到IP地址后便可以定位服务器的地址,发送http请求;

[1].域名和IP地址的区别:域名在国内为拼音形式,更容易被用户接受,用户体验感更好;IP地址是服务器的物理地址(也称作主机名),都是数字形式;[查看百度的IP地址:命令行ping www.baidu.com即可(win+R ->cmd ->ping www.baidu.com), 使用IP地址 https://61.135.169.12,也可成功访问百度首页;如今IP地址大多为动态,每隔一段时间便会进行更改]

[2].域名知识补充:解析域名是倒着解析的(目前所学只有dns需要解析域名);顶级域名分为国内和国际:国内:.cn(中国大陆); .hk香港; .jp日本; .us美国; .de德国;; 国际:.com(商业机构); .net(从事互联网服务的机构); .org(非盈利性组织) ;.edu(教育机构);目前在国内.cn是一级域名,其它下面的为二级域名,www.baidu.com: 二级域名(www.baidu.com.cn,cn省略);zhidao.baidu.com: 三级域名;

[3].关于www: 二级域名的前缀,表示万维网进行维护,所以也可认为www.baidu.com是特殊的三级域名;而zhidao.baidu.com; wenku.baidu.com;等都是百度自己维护的网页;(最初使用www作为二级域名的前缀,因为之前所有的资源都存储在一台服务器上,需要满足不同用户的不同需求,Internet提供的服务主要有:www表示提供网页服务(表示必须使用浏览器才能访问网页,而不是bbs),文件传输(FTP工具可访问),电子邮件(E-mail),远程登录(Telnet)等,如今不同资源部署到不同服务器即可,所以www可省略,国外很多网站就把www去掉了(twitter),国内由于历史遗留问题以及用户使用习惯等,还没有去掉);

--->>>上述所说皆是域名中有www只是省略不写的情况,若是域名中没有www,便称之为裸域名;

裸域名:其只能绑定dns的a记录,不能绑定dns的c记录;但是裸域名cookie的作用域范围大;(a记录便是域名对应的IP地址,c记录便是此域名还可以起别名,访问baidu.com也可跳转到百度首页,底层原因就是因为baidu.com是www.baidu.com的别名(前提是服务器端进行别名的设置),但是裸域名是不能有别名的)

(4).TCP连接(三次握手):客户端发送连接(请求报文) -> 服务器收到请求返回ACK -> 客户端建立连接;[发送给服务器数据]

客户端向服务器端发送SYN包,服务器端接收到SYN包后将其加1->ack包,然后发送客户端ack包,同时发送自己的SYN包,客户端接收到后将收到的SYN包加1->ack包,再发送给服务器端

(5).TCP连接断开(四次挥手):客户端发送FIN报文,表示发起中断连接请求("客户端数据都发送完毕了,可以断开了"),服务器端收到后发送ACK响应报文,表示"我准备一下,看资源是否传输完成,等我消息",这个时候客户端进入到了等待状态FIN_WAIT,当服务器端确定数据已经发送完成,则向客户端发送FIN报文,表示“数据全部发完了,可以断开连接了”,客户端接受到FIN报文后,表示可关闭连接了,但不知道服务器端是否清楚此次FIN报文成功传到了客户端,所以客户端还需要发送个ACK报文给服务器端,表示我知道要断开连接了,客户端会等待2MS后依然没有回复,证明服务器端已正常关闭(否则服务器接收不到回复,其会认为上次消息未成功发送,还会再次发送),客户端也可以关闭连接了,这样整个TCP连接就断开了;

[TCP连接由客户端发起连接,最终还是由客户端断开连接]

(6).关于协议:通信作用(客户端和服务器端的连接)

应用层协议:http/https等;HTTP(Hyper Text Transfer protocol),其是互联网上应用最为广泛的一种网络协议;HTTPS(Hyper Text Transfer Protocol over Secure Socket Layer),其是http的安全版,多加了一层SSL协议;

传输层协议:TCP/UDP等;TCP(Transmission Control Protocol,传输控制协议),其是基于连接的协议,也就是收发数据之前,必须要和对方建立可靠的连接,然后才能传输数据,一个TCP连接就必须要有三次"对话"才能建立起来,其中的过程非常复杂,目前明白过程即可;UDP:其是面向非连接的,不用和对方建立连接,不管对方的状态就直接发送数据,其与TCP是相对应的协议;(日常开发中经常用到的Ping命令测试主机直接是否联通,原理便是UDP协议;其很容易丢包);【应用场景:TCP/IP协议是稳定传输的协议;UDP常用来做视频/语音的实时传输,强调实时性(所以丢包也不是很影响),TCP/IP协议比UDP花费时间多】

(7).关于报文:通过报文进行沟通;http请求报文/http响应报文

[1].http请求报文:请求行/请求头/请求体

请求方法:GET(获取数据); POST(推数据到数据库中);DELETE(删除数据库中的数据);OPTION(状态); HEAD; TRACE等;常用的就是GET/POST;(POST中数据存放在请求体中,GET方式数据拼接在URL上)

[2].http响应报文:响应行/响应头/响应体

(8).GET/POST请求的区别:

[1].功能不同:GET请求主要是获取数据,POST请求主要是往数据库中插入数据;

[2].出现的位置不同:GET请求中数据作为参数拼接在URL地址栏中,而POST请求数据是存储在请求报文中请求体中;若是谈到安全性:POST请求相对于GET请求要稍安全些,实际也没安全多少,打开控制台依旧可以看到POST请求的数据;

[3].长度限制:GET请求是拼接在URL地址栏中的,而URL地址栏是有长度限制的,超出直接做截断操作;POST相比于GET请求可以存放更多数据,但是也有长度限制,如果传输数据太多的话,容易受到恶意工具以及造成服务器崩溃,影响服务器端的安全性;

(9).关于状态码:1xx:接收到请求继续处理;2xx:成功接收并返回数据;3xx:重指向(既可以指向某个服务器,也可以指向浏览器缓存);4xx:客户端错误,拼写地址出错或者服务器端没你要访问的内容,都属于访问地址出错;5xx:服务器端错误(不能提供服务);

成功状态码:200:服务器成功返回内容;301:永久重定向(响应头中会提供新URL,浏览器自动连接新url);302:临时重定向(用户本次访问新url);303:使用特定的方式请求资源(GET/POST);304:资源未被修改过,则指向缓存;

失败状态码:403:服务器禁止提供资源(不提供权限);404:页面不存在(请求内容不存在); 500: 服务器暂时不可用; 503: 服务器内部错误(维护或已经超载而无法响应);400错误:请求无效(请求未进入后台服务器),原因前端提交的字段名称/类型与后台要求的实体类不一致,导致无法封装 -> 解决方案:保证数据类型的一致性

(10).关于浏览器缓存机制:浏览器如何判断是否获取缓冲区的内容? 304状态码重定向为浏览器的缓冲内容,那如何确定是否重定向? 聚焦点:请求头/响应头的属性[缓存:节省性能]

响应头: etag ->标记图片资源; last-Modified -> 服务器最后修改的时间,其和etag配合使用; 

请求头:if-None-Match: 匹配etag, 若是其修改了,不取缓存内容,服务器端直接返回新页面内容,不需要重定向;if-Modified-Since: 将先前服务器端发过来的最后修改时间戳发送回去,判断是否相同,若相同表示没修改,直接取缓存内容即可,服务器端进行304重定向;

关于浏览器缓存机制相关的属性:Cache-Control的字段内包含很多种类的值,可分为两类,一类是RequestHeader中使用的,另一类是ResponseHeader中使用的,与前端最相关的就是响应头中使用的cache-control中的多个属性;  ->介绍:max-age:xxs;//单位秒,缓存的资源,超过一定时间就不要了,而是重新发送请求;max-stale:xxs;//过期多久时间还可以继续使用;no-cache;//如下;no-store;//每次都向服务器请求资源;public;//缓存可被任何地方缓存;private;//只允许客户端进行缓冲,代理服务器不能缓存该资源; no-transform;//不允许在传输过程中对资源做任何修改;must-revalidation;// 

补充:请求头中的refer属性:其表示用户从某个网址跳转而来,如果直接在浏览器URL地址栏请求则没有该属性;应用场景:网站统计用户从何点击进入网站,方便流量统计(其也有产品逻辑,若是用户从不太相关的地方点击进入,很可能是误操作而已)

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - >>>

- - - > 以上请求资源过程剖析聚焦点是过程的阐述,接下来分析浏览器获取数据的代码实现  - - >涉及到请求数据的方式 - - > ajax - - > ajax.open();//dns解析的过程返回浏览器端IP地址,确认向那个服务器发送请求  - - > ajax.send();//三次握手 - - > 返回数据~

补充:网络请求方式  https://blog.csdn.net/T_james/article/details/80322414

你可能感兴趣的:(网络01 网络基础、客户端请求网络资源过程剖析)