网络知识整理

一、网络协议分层

OSI七层: 物理层、数据链路层、网络层、传输层、会话层、表示层、应用层。

TCP/IP四(五)层 : 物理层(主要是光电信号的传输)、 数据链路层(MAC地址、以太网协议)、网络层(IP协议、主机到主机的通信)、传输层(TCP协议,端口到端口的通信)、应用层(HTTP、SSL、FTP等)。   ps: 物理层考虑的比较少,可以把物理层和数据链路层并称物理链路层。

分层好处:

各自独立、灵活,一层改变不会引起系统问题。结构上易分割,容易调试,促进标准化工作。

PS: 协议这边推荐阮一峰大佬的博客 http://www.ruanyifeng.com/blog/2012/05/internet_protocol_suite_part_i.html

 

 

 

二、HTTP和HTTPS的区别

1.端口: HTTP 80  |  HTTPS 443

2.安全性: HTTP 明文传输 | HTTPS 加密传输

3.证书申请方式: HTTP 免费申请 | HTTPS 需要到ca申请,一般需要交费。

4.连接方式: HTTP 无状态 | HTTPS SSL+ HTTP 可加密传输、身份认证等。

(PS: 因为https 需要在http的基础上加上ssl 也就是 需要交换TCP的3个包的基础上还要交换SSL的9个包,所以HTTP比HTTPS快)

 

三、 HTTPS 的连接过程

  • 在使用HTTPS是需要保证服务端配置正确了对应的安全证书

  • 客户端发送请求到服务端

  • 服务端返回公钥和证书到客户端

  • 客户端接收后会验证证书的安全性,如果通过则会随机生成一个随机数,用公钥对其加密,发送到服务端

  • 服务端接受到这个加密后的随机数后会用私钥对其解密得到真正的随机数,随后用这个随机数当做私钥对需要发送的数据进行对称加密

  • 客户端在接收到加密后的数据使用私钥(即生成的随机值)对数据进行解密并且解析数据呈现结果给客户

  • SSL加密建立

 

四、HTTP请求过程

1. 域名解析IP (浏览器DNS缓存、系统DNS缓存、host文件、dns域名服务器查询)

2.TCP 三次握手建立连接状态

3.服务器响应请求、浏览器获取响应结果。(具体到php项目的话 此步骤应该为 tcp建立了端口的连接后,接收方默认的http端口是80,将请求指定给监听80端口的nginx,nginx识别到php请求,不能直接与php通信,故将请求转发给了fastcgi模块,也就是实现程序php-fpm。php-fpm会有一个master进程管理着多个worker进程,多个worker进程通过争抢accept锁的方式获得这次请求的执行权,一系列的初始化后,zend引擎对被请求页面进行语法和词法解析,生成opcode,然后按顺序执行opcode,最终将处理结果返回给nginx,再由nginx返回给终端)

4.浏览器根据响应结果渲染页面。

 

五、TCP协议三次握手、四次挥手过程

1.建立连接(三次握手)  图片引用。 图中的SYN_SENT状态应该是拼写错误,正确为SYN_SEND。

 

 

2. 断开连接(四次挥手)   图片引用。

2MSL : 2倍的最大报文生存时间    RFC 793中规定MSL为2分钟,实际应用中常用的是30秒,1分钟和2分钟等。

2MSL即两倍的MSL,TCP的TIME_WAIT状态也称为2MSL等待状态,当TCP的一端发起主动关闭,在发出最后一个ACK包后,即第3次握手完成后发送了第四次握手的ACK包后就进入了TIME_WAIT状态,必须在此状态上停留两倍的MSL时间,等待2MSL时间主要目的是怕最后一个ACK包对方没收到,那么对方在超时后将重发第三次握手的FIN包,主动关闭端接到重发的FIN包后可以再发一个ACK应答包。在TIME_WAIT状态时两端的端口不能使用,要等到2MSL时间结束才可继续使用。当连接处于2MSL等待阶段时任何迟到的报文段都将被丢弃。不过在实际应用中可以通过设置SO_REUSEADDR选项达到不必等待2MSL时间结束再使用此端口。

 

 

六、HTTP状态码

1xx 信息型状态码,接收的请求正在处理。

2xx 成功状态码 请求正常处理完毕。

3xx 重定向状态码 需要加附加操作来完成请求。

4xx 客户端错误状态码 服务器端无法处理请求。

5xx 服务端错误状态码 服务器处理请求出错。

301 永久重定向  302暂时重定向   401未授权  403禁止访问 404文件未找到   499 超时(服务端处理时间过长,客户端主动断开连接)  500 服务器内部错误  502 网关接到的上游服务器响应无效 

  503 服务器暂时无法处理请求     504 网关超时  

 

七、GET和POST的区别

1. url可见性  get可见,参数在url中。 post不可见,参数在http包内(request body)。

2.数据长度限制。 get 受不同浏览器的url长度限制,基本上在2k-4k之间。 理论上post无长度限制,起限制作用的是服务器的处理程序的处理能力 ,可以修改服务器相关配置。

3.安全性上, post比get安全稍微好一些,但是没什么用,抓包一样可见,防君子不防小人。

4.编码方式上,get只支持url编码,post支持多种编码方式。

5.数据类型上,get只支持ASCII, post无限制,支持二进制数据。

6.缓存上,get的数据可以缓存。 post的无法缓存  (GET请求会被浏览器主动cache,而POST不会,除非手动设置)

7.后退按钮get参数还在,历史记录中也可追溯。  post的参数均丢失。

8. get 的 效率 高!

 

八、cookie和session 的区别

session 是 服务端 保存的数据结构。 一般用来跟踪用户状态。

cookie 是 客户端 保存用户信息的一种机制。 用来记录用户信息。 一般大小不超过4k。

session 一般用session_id 来进行唯一性标识。  cookie是实现并传递session_id的一种方式, 也可以通过url和header传递。

 

九、Http协议请求和响应

请求报文:

  请求行:请求方法、URL、协议版本

      请求首部字段: 每个Key-Value为一行,结尾空行不可少。   Host   User-Agent   Connection   Keep-Alive等

  请求内容实体: 可选。

 

响应报文:

  状态行: 协议版本、 状态码、 状态描述

  响应首部字段: 每个Key-Value为一行,结尾空行不可少。  Server (Http 服务器信息)   Connect-Type   Connect-Length等

  响应实体内容: 可选。

 

posted @ 2020-02-17 18:44  DevelopersAndGamers  阅读(228)  评论(0编辑  收藏  举报