HTTP/HTTPS/TCP/IP协议
一、从一个HTTP请求看网络分层原理
在网络传输中会遇到各种各样的问题
- 数据会丢包
- 重新发送会造成数据重复
为了简化网络的复杂度,网络通信的不同方面被分解为多层次结构,每一层只与紧挨着的上层或者下层进行交互,将网络分层,这样就可以修改,甚至替换某一层的软件,只要层与层之间的接口保持不变,就不会影响到其他层。
OSI(Open System Interconnection Reference Model)
TCP/IP
一个HTTP请求的分层解析流程
输入域名->浏览器检索是否有DNS缓存/hosts文件是否配置->都无则发起DNS请求->DNS使用UDP进行传输->网络层使用ARP协议
二、HTTP协议
超文本传输协议(HyperText Transfer Protocol)
一种无状态的,以请求/应答方式运行的协议,它使用可拓展的语义和自描述消息格式,与基于网络的超文本信息系统(HTML)灵活的互动
1、HTTP报文格式
- 起始行(start line):描述请求或者响应的基本信息
- 头部字段集合(header):使用key-value形式更详细地说明报文
- 消息正文(entity):市级传输的数据,它不一定是纯文本,可以是图片、视频等二进制数据
2、请求行报文格式
- 请求方法:GET/HEAD/PUT/POST,表示对资源的操作;
- 请求目标:通常是一个URI,标记了请求方法要操作的资源
- 版本号:表示报文使用的HTTP协议版本
3、响应行报文格式
- 版本号:表示报文使用的HTTP协议版本;
- 状态码:一个三位数、用代码的形式表示处理的结果
- 原因:作为数字状态码补充,是更详细的解释说明
4、HTTP头字段
头部字段是key-value形式,key和value之间用":"分隔,最后用CRLF换行表示字段结束。比如"Content-type:application/json",HTTP头字段非常灵活,不仅可以用常用的key(User-Agent浏览器名称, Referer来源,Cookie,Content-type数据格式,accept可接受的文件类型,accept-encoding可接受的数据编码,accept-language当前使用的浏览语言),也可以自定义key
头字段注意事项
- 字段名不区分大小写,字段名里不允许出现空格,可以使用连字符"-"但不能使用下划线"_"。字段名后面必须紧接着":"不能有空格,而":"后的字段值可以有多个空格
- 字段的顺序是没有意义的,可以任意排序
- 字段原则上不能重复,除非这个字段本身语义允许,如Set-Cookie
5、常用头字段
HTTP协议里有非常多的头字段,分四类
- 请求字段: Host,Referer
- 相应字段:Server,Date
- 通用字段:在请求头和响应头里都可以出现 Content-type,Connection
三、HTTP请求的完整过程
当用户在浏览器输入网址回车之后,网络协议都做了哪些工作
- 浏览器解析URL中的域名
- 根据域名获取对应的ip地址,首先从浏览器缓存中查看
chrome://net-internals/#events
如果没有则从本机域名解析文件hosts,如果还没有则发起DNS请求 - 拿到IP地址后,浏览器与服务器进行三次握手
- 握手建立之后,开始发送HTTP请求报文
- 服务器收到浏览器报文之后开始请求报文解析,生成响应数据,发送相应数据
- 浏览器收到响应之后,开始渲染页面
四、TCP协议
TCP(Transmission Control Protocol)
面向连接的,可靠的,基于字节流的传输层通信协议
特点:
- 基于连接的:数据传输之前需要建立连接
- 全双工的:双向传输
- 字节流:不限制数据大小,打包成报文段,保证有序接收,重复报文自动丢弃
- 流量缓冲:解决双方处理能力的不匹配
- 可靠的传输服务:保证可达,丢包时通过重发机制实现可靠性
- 拥塞控制:防止网络出现恶行拥塞
TCP连接管理
1、TCP连接:四元组【源地址、源端口、目的地址、目的端口】
2、确立连接:三次握手
a. 同步通信双方初始序列号(ISN initial sequence number)
b. 协商TCP通信参数(MSS,窗口信息,指定校验和算法)
如何进行握手
1、服务端监听一个端口(一般是80),进入Listening状态
2、客户端发送SYN(随机生成x)进入SYN-SENT状态
3、服务端收到SYN(x),发送SYN(y)和ACK(x+1)(通过SYN里的seq确认是哪一条SYN)进入SYN-RECEIVED状态
4、客户端收到ACK(x+1),发送ACK(y+1),进入ESTABLISHED状态
5、握手建立成功,进入ESTABLISHED状态
3、关闭连接:四次挥手(双方都可以主动关闭连接)
操作过程
1、客户端发送FIN(i),客户端进入FIN_WAIT_1的状态
2、服务端发送ACK(i+1),进入CLOSE_WAIT状态
3、服务端进行收尾工作,调用close指令,进入LAST_ACK状态,发送FIN(j)
4、客户端发送ACK(j+1),进入TIME_WAIT状态,等待2MSL(最大报文生存时间)(原因:防止ACK(j+1)丢失,如果客户端直接关闭,客户端无法响应服务端;同时在传输中的数据无法及时到达)
5、服务端释放连接
字节流协议
数据可靠性传输
停止等待协议
重传机制
1、ack报文丢失
2、请求报文丢失
这两种方法效率低下
滑动窗口协议与累计确认(延时ack)
滑动窗口大小同通过tcp三次握手对端协商,且受网络状态影响
滑动窗口协议属于TCP协议的一种应用,用于网络数据传输时的流量控制,以避免拥塞的发生
特点
1、通信双方以全双工方式进行通信
2、控制复杂
3、传输效率高,尤其对信道质量好,差错率低的情况
HTTPS协议
所有的HTTP请求和响应在发送到网络之前,都要进行加密
SSL/TLS
安全套接协议(Secure Sockets Layer)
摘要算法
把任意数据输出成一个定长的串
md5, sha1, sha2, sha1 256
对称加密算法 xor
加密过程:
原文:100100111000
密钥:111100001111 (xor)
密文:011000110111
解密过程:
密文:011000110111
密钥:111100001111 (xor)
原文:100100111000
AES,
非对称加密
公钥公开,密钥严格保密
使用公钥加密,使用私钥解密
使用私钥加密,使用公钥解密
DNS劫持
身份验证
数字证书
公钥数字证书(保证公钥的安全)CA机构
如何申请
1、生成自己的公钥和私钥,服务器保留自己的私钥
2、向CA机构提交公钥,公司,域名等等待认证
3、CA验证,颁发证书,包括:公钥,组织信息,CA信息,有效时间,证书序列号,同时生成一个签名(hash);CA再使用私钥对信息摘要进行加密,密文就是证书的数字签名