一、网络协议分层

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. 微信7.0以后更新后H5页面定位不准确

    在有定位的页面,微信更新完7.0以后定位也不提醒说是否同意定位 然后定位都跑到几百公里以外的地方了,然后怎么百度都不知道是啥问题,后面问了前端说微信更了7.0以后好像HTTP的就不支持了,然后我就去百 ...

  2. 你必须知道的.Net 8.4.4 位枚举

    位标记集合是一种由组合出现的元素形成的列表,通常设计为以“位或”运算组合新值:枚举 类型则通常表达一种语义相对独立的数值集合.而以枚举类型来实现位标记集合是最为完美的组 合,简称为位枚举.在.NET ...

  3. Day5 - D - Conscription POJ - 3723

    Windy has a country, and he wants to build an army to protect his country. He has picked up N girls ...

  4. Eclipse 不能调试的问题

    现象 弹出 Cannot connect to VM Console 中的输出是: ERROR: transport error 202: connect failed: Connection ref ...

  5. 数据结构——Java Stack 类

    定义 栈是Vector的一个子类,它实现了一个标准的后进先出的栈.堆栈只定义了默认构造函数,用来创建一个空栈. 堆栈除了包括由Vector定义的所有方法,也定义了自己的一些方法. 图例 在下面图片中可 ...

  6. .net 4.0 : Missing compiler required member 'Microsoft.CSharp.RuntimeBinder.Binder.****'

    解决办法,添加 MicroSoft.CSharp 的引用.

  7. Maven的原理和使用

    一.Maven能做什么 1.假设我们有10个项目,都需要引入spring core模块,那么需要十份重复的Spring Core.jar和commons-logging.jar 使用Maven:mav ...

  8. Django(四) 后台管理:创建管理员、注册模型类、自定义管理页面显示内容

    后台管理 第1步.本地化:设置语言.时区 修改project1/settings.py #LANGUAGE_CODE = 'en-us' LANGUAGE_CODE = 'zh-hans' #设置语言 ...

  9. LeetCode874 模拟行走机器人(简单模拟—Java之HashSet简单应用)

    题目: 机器人在一个无限大小的网格上行走,从点 (0, 0) 处开始出发,面向北方.该机器人可以接收以下三种类型的命令: -2:向左转 90 度-1:向右转 90 度1 <= x <= 9 ...

  10. 剑指offer自学系列(四)

    题目描述: 输入一个正整数数组,把数组里面所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个,例如输入数组{3,32,321},输出的最小数字为321323 题目分析: 如果采用穷举法,把 ...