一、网络协议分层

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 的连接过程

1.首先客户端先给服务器发送一个请求

2.服务器发送一个SSL证书给客户端,内容包括:证书的发布机构、有效期、所有者、签名以及公钥

3.客户端对发来的公钥进行真伪校验,校验结果为真则使用公钥对对称加密算法以及对称密钥进行加密

4.服务器端使用私钥进行解密并使用对称密钥加密确认信息发送给客户端

5.随后客户端和服务端就使用对称密钥进行信息传输

四、HTTP请求过程

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

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

3.服务器响应请求、浏览器获取响应结果。(具体到php项目的话 此步骤应该为 tcp建立了端口的连接后,将请求指定给监听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等

  响应实体内容: 可选。

2020PHP面试-网络篇的更多相关文章

  1. 2020PHP面试-Redis篇

    一.Redis 数据类型 1. string 字符型. 2.hash hash  结构化的对象.  key不可重复 3.list 队列  lpush rpop  lpop rpush 4. set 集 ...

  2. 2020PHP面试-PHP篇

    一.列举一些PHP的设计模式 单例模式:保证在整个应用程序的生命周期中,任何一个时刻,单例类的实例都只存在一个,同时这个类还必须提供一个访问该类的全局访问点. 工厂模式:定义一个创建对象的接口,但是让 ...

  3. 2020PHP面试-SQL篇

    一.乐观锁和悲观锁 1.悲观锁是指假设并发更新会发生冲突,不管冲突是否会发生,都会使用锁机制. 优点: 完全保证数据安全. 缺点:锁机制会有额外开销,并发度降低. 可能会产生死锁. 2. 乐观锁是指假 ...

  4. iOS开发网络篇—数据缓存

      iOS开发网络篇—数据缓存 一.关于同一个URL的多次请求 有时候,对同一个URL请求多次,返回的数据可能都是一样的,比如服务器上的某张图片,无论下载多少次,返回的数据都是一样的. 上面的情况会造 ...

  5. iOS开发网络篇—监测网络状态(转)

    文章转载自:http://www.cnblogs.com/wendingding/p/3950114.html iOS开发网络篇—监测网络状态 一.说明 在网络应用中,需要对用户设备的网络状态进行实时 ...

  6. iOS开发网络篇—大文件的多线程断点下载

    http://www.cnblogs.com/wendingding/p/3947550.html iOS开发网络篇—多线程断点下载 说明:本文介绍多线程断点下载.项目中使用了苹果自带的类,实现了同时 ...

  7. iOS开发网络篇—简单介绍ASI框架的使用

    iOS开发网络篇—简单介绍ASI框架的使用 说明:本文主要介绍网络编程中常用框架ASI的简单使用. 一.ASI简单介绍 ASI:全称是ASIHTTPRequest,外号“HTTP终结者”,功能十分强大 ...

  8. iOS开发网络篇—网络编程基础

    iOS开发网络篇—网络编程基础 一.为什么要学习网络编程 1.简单说明 在移动互联网时代,移动应用的特征有: (1)几乎所有应用都需要用到网络,比如QQ.微博.网易新闻.优酷.百度地图 (2)只有通过 ...

  9. iOS开发网络篇—搭建本地服务器

    iOS开发网络篇—搭建本地服务器 一.简单说明 说明:提前下载好相关软件,且安装目录最好安装在全英文路径下.如果路径有中文名,那么可能会出现一些莫名其妙的问题. 提示:提前准备好的软件 apache- ...

随机推荐

  1. 17 MySQL的小技巧

    1.正则表达式的使用   ^ 在字符串开始处进行匹配 $ 在字符串末尾处进行匹配 . 匹配任意单个字符,包括换行符 [...]  匹配出括号内的任意字符 [^...]  匹配不出括号内的任意字符 a* ...

  2. Vue 实现分页效果

    分页,是在业务中经常要用到,为了节省用户流量和提升用户体验 讲一下思路: 首先是定义页号currentPage 和 页大小pagesize,用一个数组保存总数据: 用一个计算属性page_arrs,作 ...

  3. vue题型

    一  v-show和v-if区别 个人理解 相同:v-show和v-if都能控制元素的显示和隐藏.两个都是开关. 区别: 1.v-if 是懒加载,是有条件的渲染,它会确保在切换过程中添加或者删除元素. ...

  4. HashMap之Hash碰撞源码解析

    转自:https://blog.csdn.net/luo_da/article/details/77507315 https://www.cnblogs.com/tongxuping/p/827619 ...

  5. 023、MySQL取文本长度取字符串长度

    #取文本长度,一个文字算1长度 SELECT CHAR_LENGTH('田攀520'); #UTF-8的数据库,值为5 #取文本长度,汉字算多个字符,数字和英文算一个字符 SELECT LENGTH( ...

  6. 010、MySQL日期时间戳转化为文本日期时间

    #时间戳转化文本时间 SELECT from_unixtime( unix_timestamp( curdate( ) ) ); #时间戳转化文本时间格式化 SELECT from_unixtime( ...

  7. 6 应用Nginx之后

    以上的问题,涉及到Varnish

  8. 注解方式实例化Java类

    context:component-scan标签: Sprng容器通过context:component-scan标签扫描其base-package标签属性值指定的包及其子包内的所有的类并实例化被@C ...

  9. 不可不知的spark shuffle

    shuffle概览 一个spark的RDD有一组固定的分区组成,每个分区有一系列的记录组成.对于由窄依赖变换(例如map和filter)返回的RDD,会延续父RDD的分区信息,以pipeline的形式 ...

  10. 微信浏览器 UA

    mozilla/5.0 (linux; android 5.1.1; mi note pro build/lmy47v) applewebkit/537.36 (khtml, like gecko) ...