2020PHP面试-网络篇
一、网络协议分层
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面试-网络篇的更多相关文章
- 2020PHP面试-Redis篇
一.Redis 数据类型 1. string 字符型. 2.hash hash 结构化的对象. key不可重复 3.list 队列 lpush rpop lpop rpush 4. set 集 ...
- 2020PHP面试-PHP篇
一.列举一些PHP的设计模式 单例模式:保证在整个应用程序的生命周期中,任何一个时刻,单例类的实例都只存在一个,同时这个类还必须提供一个访问该类的全局访问点. 工厂模式:定义一个创建对象的接口,但是让 ...
- 2020PHP面试-SQL篇
一.乐观锁和悲观锁 1.悲观锁是指假设并发更新会发生冲突,不管冲突是否会发生,都会使用锁机制. 优点: 完全保证数据安全. 缺点:锁机制会有额外开销,并发度降低. 可能会产生死锁. 2. 乐观锁是指假 ...
- iOS开发网络篇—数据缓存
iOS开发网络篇—数据缓存 一.关于同一个URL的多次请求 有时候,对同一个URL请求多次,返回的数据可能都是一样的,比如服务器上的某张图片,无论下载多少次,返回的数据都是一样的. 上面的情况会造 ...
- iOS开发网络篇—监测网络状态(转)
文章转载自:http://www.cnblogs.com/wendingding/p/3950114.html iOS开发网络篇—监测网络状态 一.说明 在网络应用中,需要对用户设备的网络状态进行实时 ...
- iOS开发网络篇—大文件的多线程断点下载
http://www.cnblogs.com/wendingding/p/3947550.html iOS开发网络篇—多线程断点下载 说明:本文介绍多线程断点下载.项目中使用了苹果自带的类,实现了同时 ...
- iOS开发网络篇—简单介绍ASI框架的使用
iOS开发网络篇—简单介绍ASI框架的使用 说明:本文主要介绍网络编程中常用框架ASI的简单使用. 一.ASI简单介绍 ASI:全称是ASIHTTPRequest,外号“HTTP终结者”,功能十分强大 ...
- iOS开发网络篇—网络编程基础
iOS开发网络篇—网络编程基础 一.为什么要学习网络编程 1.简单说明 在移动互联网时代,移动应用的特征有: (1)几乎所有应用都需要用到网络,比如QQ.微博.网易新闻.优酷.百度地图 (2)只有通过 ...
- iOS开发网络篇—搭建本地服务器
iOS开发网络篇—搭建本地服务器 一.简单说明 说明:提前下载好相关软件,且安装目录最好安装在全英文路径下.如果路径有中文名,那么可能会出现一些莫名其妙的问题. 提示:提前准备好的软件 apache- ...
随机推荐
- 【WPF学习】第二十二章 文本控件
WPF提供了三个用于输入文本的控件:TextBox.RichTextBox和PasswordBox.PasswordBox控件直接继承自Control类.TextBox和RichTextBox控件间接 ...
- 《新标准C++程序设计》4.4(C++学习笔记14)
运算符重载为友元函数 一般情况下,将运算符重载为类的成员函数,是较好的选择. 但有时,重载为成员函数不能满足使用要求,重载为普通函数,又不能访问类的私有成员,所以需要将运算符重载为友元. class ...
- gem5-gpu 运行 PARSEC2.1
PARSEC是针对共享内存多核处理器(CPU)的一套基准测试程序,详细介绍见wiki:http://wiki.cs.princeton.edu/index.php/PARSEC,主要参考:http:/ ...
- 如何让你的学术Essay写作看起来更高级?
学术风格不仅是使用某些特定的词汇或者特定的表达方式.学术风格还会涉及到你的思考方式.推理方式以及你如何利用某个领域内已知的发现.学术风格是英国大学学习的核心.所以在平时的学习中,英国环球论文小编建议大 ...
- delphi 讲的比较详细的多线程(推荐)
在了解多线程之前我们先了解一下进程和线程的关系 一个程序至少有一个主进程,一个进程至少有一个线程. 为了保证线程的安全性请大家看看下面介绍 Delphi多线程同步的一些处理方案大家可以参考:http: ...
- 十、Vue:Vuex实现data(){}内数据多个组件间共享
一.概述 官方文档:https://vuex.vuejs.org/zh/installation.html 1.1vuex有什么用 Vuex:实现data(){}内数据多个组件间共享一种解决方案(类似 ...
- 吴裕雄--天生自然java开发常用类库学习笔记:LinkedList类
import java.util.LinkedList ; public class LinkedListDemo01{ public static void main(String args[]){ ...
- 从0开始自己配置一个vps虚拟服务器(2)
配置php环境 1.安装php安装所依赖的包 yum -y install gcc gcc-c++ libxml2 libxml2-devel 2.cd usr/local/src 进入目录,在这个目 ...
- Python3中的bytes和str类型
Python 3最重要的新特性之一是对字符串和二进制数据流做了明确的区分.文本总是Unicode,由str类型表示,二进制数据则由bytes类型表示.Python 3不会以任意隐式的方式混用str和b ...
- Python序列内单双引的问题——未解决
在学习python基础的时候,遇到这样一个问题: tuple=(2,2.3,"yeah",5.6,False)list=[True,5,"smile"] 这样输 ...