HTTP
简单来说,打开一个网页使用的就是HTTP协议
HTTPS其实是基于HTTP来实现的,多了一个加密层
URL
URL简单来说就是网址,平时所说的网址指的就是URL
IP地址不太方便记忆和传播,用一些更好记忆的字符串来表示域名,浏览器在访问域名时会自动把域名转成IP地址
查询字符串(quary_string)中的键值对都是用户自定义协议的一部分
提醒:像/ ? 此类字符,已经被URL当做特殊意义理解,使用不能随意出现;若参数中出现此类字符,就需要进行转义了
转义规则(urlencode):
将需要转码的字符转为16进制,然后从右到左,取4位(不足4位直接处理),每2位算作1位,前面加上%,编码成%XY的格式
HTTP协议的格式
HTTP请求:
1.首行:
a.方法:GET/POST/PUT/DELETE…
b.url
c.版本号 :HTTP/1.1 HTTP/2.0 HTTP/3.0
三个部分之间使用空格分隔
2.协议头(header):
a. 请求的属性, 冒号分割的键值对
b.每个键和值之间使用:分隔
c.遇到空行表示Header部分结束
3.空行:
表示header到此结束
4.协议正文(body):
a. 空行后面的内容都是Body
b.如果Body存在, 则在Header中会有一个Content-Length属性来标识Body的长度
c.一般GET请求没有正文,POST有正文
HTTP响应
1.首行
a.版本号
b.状态码
c.状态码描述信息
2.协议头(header)
a. 请求的属性, 冒号分割的键值对
b.每个键和值之间使用:分隔
c.遇到空行表示Header部分结束
3.空行
header部分结束标记
4.协议正文(body)
a. 空行后面的内容都是Body
b.如果Body存在, 则在Header中会有一个Content-Length属性来标识Body的长度
c.如果服务器返回了一个html页面, 那么html页面内容就是在body中
常用方法
方法 | 说明 |
---|---|
GET | 获取资源 |
POST | 传输实体主体 |
PUT | 传输文件 |
HEAD | 获取报文首部 |
DELETE | 删除文件 |
OPTIONS | 询问支持的方法 |
TRACE | 追踪路径 |
CONNECT | 使用隧道协议连接代理 |
LINK | 建立和资源之间的联系 |
UNLINK | 断开连接 |
最常用的就是GET和POST方法
GET和POST的区别:
1.GET请求往往把自定制数据放在query_string中
2.POST请求往往把自定制数据放在body中
常见的状态码:
状态码 | 名称 |
---|---|
1XX | 接收的请求正在处理 |
200 OK | 访问成功 |
2XX | 响应成功 |
302 Found | 重定向 |
3XX | 重定向 |
404 Not Found | 没有找到 |
4XX | 客户端出错 |
403 Forbidden | 没有权限 |
502 Bad Gateway | 找不到服务器 |
504 Gateway Timeout | 服务器响应超时 |
5XX | 服务器出错 |
常见的header
- Content-Type: 数据类型(text/html等)
- Content-Length: Body的长度
- Host:客户端告知服务器, 所请求的资源是在哪个主机的哪个端口上
- User-Agent: 声明用户的操作系统和浏览器版本信息
- referer:当前页面是从哪个页面跳转过来的
- location: 搭配3xx状态码使用, 告诉客户端接下来要去哪里访问
- Cookie:用于在客户端存储少量信息. 通常用于实现会话(session)的功能
session 服务器维护端的一个数据结构,记录了用户的身份信息
session id 就是session对象的唯一身份标识,session id 保存在浏览器中,浏览器后续再访问服务器时。就会自动带着session id 从而让服务器知道当前请求是哪管用户发来的服务器端使用一个hash table之类的结构来维护若干个用户的身份信息 key 就是session id
value就是完整的session对象
cookie就是按照Host这个header来划分的
传输层
传输层负责端到端之间的传输,且只关注起点和终点
起点:源ip/源端口
终点:目的ip/目的端口
端口号(Port)
端口号标识了一个主机上进行的不同的引用程序
端口号范围划分:
0-1023:知名端口号,HTTP FTP SSH等应用层协议的端口号都是固定的
1024-65535:操作系统动态分配的端口号,客户端程序的端口号就是在这个范围内
知名端口号
服务器 | 端口号 |
---|---|
ssh | 22 |
ftp | 21 |
telent | 23 |
http | 80 |
https | 443 |
UDP协议
a.源端口号(16位)
b.目的端口(16位)
c.UDP长度(16位)上限是64kb
d.UDP检验和(校验和)(16位)
使用了CRC校验
取每个字节,把每个字节的数据循环相加,得到一个最终的数字,就是校验和
接收端按照同样的规则计算校验和,和发送端相比,如果数据一致,则认为数据没有发生错误
UDP的特点:
1.无连接
2.不可靠
3.面向数据报
4.全双工
基于UDP的应用层协议:
NFS: 网络文件系统
TFTP: 简单文件传输协议
DHCP: 动态主机配置协议
BOOTP: 启动协议(用于无盘设备启动)
DNS: 域名解析协议
当然, 也包括自己写UDP程序时自定义的应用层协议;
TCP协议
特点:
1.有连接
2.可靠传输
3.面向字节流
4.全双工
冗余:加强了可靠性,降低了数据一致性
一、确认应答
保证可靠性的核心机制
为了区分当前是应答哪个数据,引入了序号和确认序号的概念
序号:给每个字节都编了序号
确认序号:表示当前序号之前的数据已经收到了,同时表示向发送端索要当前确认信号开始的数据
二、超时重传
保证可靠的核心机制
传输一条数据缺没有确认应答时,等待一段时间,会进行重传;重传可能会进行若干次,且重传次数越多,丢包概率越小,而重传等待的时间间隔,也会依次发送变化
(1)当主机A给主机B发送一条数据后,可能因为网络延迟等原因数据无法到达主机B
(2)主机A为能收到主机B回馈的确认序号
因为主机B会收到很多重复数据,TCP利用序号,识别出那些包是重复的,把重复的去掉(去重)
三、连接管理
三次握手建立连接
四次挥手断开连接
建立连接的意义:
(1)双方各自试探对方,确认对方是否可以建立连接(双方读写的能力)
(2)双方可以在建立连接的过程中协商一些必要的数据(TCP序号的基准值)
三次握手具体过程
客户端先发起一个建立连接的请求(SYN同步报文段)服务器收到SYN之后立刻返回一个ACK且回复的ACK也是一个SYN,客户端收到SYN之后会再次返回一个ACK
涉及到的具体状态:
LISTEN状态:服务端状态,表示手机开机,信号良好,随时有其他服务器建立连接
ESTABLISHED:接通他人电话,表示连接已经建立完成,随时可以通信
四次挥手断开连接
中间过程ACK:一收到FIN,内核立即回复
FIN:程序中调用socket对象的close方法的时候才会发送FIN
三次握手的中间两次操作一定是合在一起的
四次挥手中间两次操作可能合在一起,也可能不会
设计到的重要状态:
CLOSE_WAIT状态:等待程序调用close来完成最终的端口连接过程;如果一个服务器上出现大量CLOSE_WAIT,表明代码中存在bug,没有调用close,或者没有执行到
TIME_WAIT状态:虽然程序可能执行结束,但是还要保持造TIME_WAIT一段时间,因为发送的最后一个ACK可能会丢包
TIME_WAIT等待时间一般为2MSL(MSL:网络上两个主机之间传输的理论最大时间,在Centos7上默认60秒)
四、滑动窗口
窗口:不等待ACK的情况下批量发送多少数据
滑动:每次收到一个ACK之后,就依次发送下一条数据等待ACK的数据区间就往后移动
窗口越大,传输效率越高
可靠性:如果窗口无限大,那么接收端可能处理不过来,网络环境也可能承载不了
如果滑动窗口过程中丢包了怎么办?
1.ACK丢失:问题不大,确认序号表示的意义就是当前序号之前的数据收到了,后一个ACK就能涵盖前一个ACK的含义
2.数据丢失:接收端会反复尝试索要该丢掉的数据,重复若干次之后,发送端就会认为丢包,并重传对应的数据,对应已经成功发送的数据,就没有必要重传了
确认序号的巧妙设定 快速重传
五、流量控制
限制滑动窗口大小的机制
接收缓冲区:
1.交易场所
2.两种关系:生产者/消费者
3.三种关系:生产者和生产者之间的互斥关系;消费者和消费者之间的互斥关系;生产者和消费者之间同步和互斥关系
接收端的接收缓冲区的剩余空间:衡量接收端的处理能力
接收缓冲区剩余空间越大,处理能力越强
六、拥塞控制
根据网络的拥堵情况,来限制发送端的发送速率
试探方式:刚开始使用较小的滑动窗口,如果没有丢包,说明网络畅通,增大滑动窗口;如果发送丢包,说明网络可能拥堵,减小滑动窗口
发送端滑动窗口大小 = min(流量控制中窗口大小,拥塞窗口)
七、延时应答
提高传输效率的方式
尽可能提高窗口大小
延时应答导致延时时间中接收端的程序已经处理了一部分数据,此时ACK中的窗口大小就更大了
八、捎带应答
延时应答的基础上,再提高传输效率
内核收到数据,立刻回复ACK(应用程序发送)
延时应答的基础上,把应用程序发送的业务数据和系统发送的ACK合二为一
九、面向字节流
十、黏包问题(面向字节流导致的问题)
TCP/UDP对比:
TCP用于可靠传输,应用于文件传输、重要状态更新等场景;
UDP用于对高速传输和实时性要求较高的通信领域及广播
如何用UDP实现可靠传输
1.引入序号,保证数据顺序
2.引入确认应答,确保接收端收到了数据
3.引入超时重传,如果隔一段时间没有收到应答,重新发送数据
网络层
最核心的协议就是IP协议(IPv4 IPv6)
1.地址管理:使用一个32位整数表示地址
2.路由选择:
- 动态分配
- NAT机制:一个IP供多个主机使用
- IPv6
两个主机之间要进行通信,需要找到一条合适的路径
A -> B之间存在很多路径
核心的过程是按照“一跳一跳”的方式进行路由选择的一跳指的是通过路由器访问到下一个设备
六度空间
TTL默认值是64,问路时最多问64次
网段划分:
把一个IP地址分成网络号和主机号
同一个局域网中,网络号相同,主机号不同
相邻两个局域网,网络号不同
局域网之间使用路由器连接,一个路由器往往有多个i票地址
如何区分网络号和主机号:通过子网掩码(32位整数,也可以表示成十分进制要求高位必须为1,地位必须为0)区分
子网掩码与IP地址按位与得到网络号
私有IP上通常情况下只能在局域网内部访问
公网IP上搭建的IP才能被任何设备访问(云服务器)
数据链路层:
负责两个相邻节点之间如何传递信息
MAC地址:表示互联网上的唯一一个主机
6个字节来表mac地址
以太网:不光规定了数据链路层的内容,也规定了物理层的内容
以太网数据帧
加上帧头和帧尾
帧头:
-
源Mac
-
目的Mac
-
类型
帧尾:CRC校验和
MTU表示一个数据链路层数据帧的最大长度
以太网的MTU是1500个字节
MTU会导致IP数据报分包
MTU对于传输层没有影响
不同的数据链路层协议对于MTU的值是不同的
ARP协议 RARP协议