计算机网络
基本概念
衡量计算机性能的指标:
- 速率
- 吞吐量
- 带宽
- 时延:指数据从网络一端传送到另一端所用的时间
- 发送时延(传输时延):发送数据全部进入信道所用的时间(机器内部)
- 传播时延:数据在信道上传输所占用的时间(信道上)
- 排队时延:分组在排队等待路由分发时所消耗的时间
- 处理时延:路由器或主机在接收到数据包后处理数据所用的时间
OSI参考模型0
其中前三层主要是由物理链路组成的,5 6 7 这三层则是由软件(协议)控制的
物理层
物理层主要负责规定了电气特性,比如光纤,有光脉冲表示1,无表示0.
物理层设备需要中继器,这是为了保证数据传输的稳定性,解决信号衰减、信号失真的问题。中继器会对信号进行再生和还原,增加了信号传输的距离。
数据链路层
- 封装成帧:将网络信号封装成数据包,在链路层就叫数据帧。
- 透明传输:由于链路层会将网络信号添加首部和尾部进行封装,那比如传输的内容和待封装的首部信息一样,那么网络层进行解析就可能搞混乱,因此需要采取一定的措施,让接收方不被误导。(类似js的转义字符
这个是标签还是普通字符串) - 差错控制:确保数据传输不会出错
- 流量控制:注意,TCP也有流量控制,TCP是端到端的流量控制,链路层是点到点的流量控制。(滑动窗口协议、选择重传协议)
网络层
网络层主要是将分组从一台主机移动到另一台主机
分组交换就是:当
主机H1
要向另一主机H2
发送数据(报文)时,首先将数据划分成若干个等长的分组
,然后将这些分组一个接一个地发往里与H1相联的路由A
,当A
接到分组后,先放入缓冲区,再按一定的路由算法确定该分组下一步将发注哪个结点,如此一个结点一个结点传递,直到最终目的H2
。数据报:是通过网络传输的数据的基本格式
传输层
传输层是面向计算机进程之间的,端对端的
传输层主要协议分为
- UDP 用户数据报协议(无连接)
- TCP 传输控制协议(面向连接)
端口:用来找到计算机上运行的各个进程,数值为16位 0-65535
端口的分类:
- 服务器使用的端口号
- 熟知端口号(系统端口号)0-1023,这些端口号被指派给TCP/IP协议下的重要的应用程序。
- 登记端口号,这些端口号使用前需要在IANA按照规定的手续进行办理。 1024-49151
- 客户端使用的端口号 49152-65535 短暂端口号,这类端口号留给进程进行短暂的使用。
UDP
HTTP
底层是TCP协议,确保数据传输的准确性(顺序正确,没有丢包)三次握手四次挥手
http报文结构包括:起始行+头部+空行+实体
- 简单快速
- 灵活:允许任意类型的数据对象
- 无状态性
HTTP特点
灵活可扩展:
语法限制较为宽泛
传输形式多样
可靠传输:
HTTP基于TCP/IP,因此更可靠。
请求响应:
有来有回
无状态:
无法记录状态信息
HTTP缺点
无状态:
主要分场景来看的,在需要长连接场景中,需要保存大量的上下文信息,以免传输大量重复的信息,这时无状态就是HTTP的缺点了。
当不需要状态时,大大节省了网络开销,反而是优点。
明文传输:
比如WIFI陷阱,就是通过HTTP明文传输的性质,疯狂抓取用户信息。
队头阻塞问题
起始行
对于请求报文
1 | GET /login HTTP/1.1 |
响应报文
1 | HTTP/1.1 200 OK |
头部
请求头/响应头
- 大小写不敏感
- 字段名不允许出现_或空格
- 字段名后面必须接 :
空行
用来区分头部和实体
如果在头部之间故意加一个空行:
那么空行后的内容会被认为是实体
实体
请求体+响应体
请求方法
八种
- GET:通常用于获取资源(GET不能对服务器产生副作用)
- POST:向服务器提交数据
- PUT:与POST相似,但是侧重修改
- OPTIONS:列出对特定资源的服务器支持的请求方法
- HEAD:只返回接口的首部
- DELETE:删除资源(很少用到)
- TRACE:追踪请求,常常用于测试
- CONNECT:代理
GET和POST的区别
- 缓存角度:GET会被浏览器缓存,但是POST默认不会
- 编码角度:GET只进行URL编码,只支持ASKCII
- 参数角度:GET参数外露,不利于进行敏感信息传输
- 幂等角度:GET是幂等的,基执行相同操作,结果依然相同
- TCP角度:GET往往是一个数据包发出,而POST一个或两个,依据不同浏览器而定
- 爬虫角度:GET会被网络蜘蛛直接访问,因此,不应将不利于服务器的操作用于GET协议。
状态码
1XX:表示目前协议处理处于中间状态,还需要后续操作。
101 在HTTP协议准备升级到WS协议时,如果服务器同意变更,则会发送状态码101.
100 continue
2XX:表示成功状态。
200 OK 成功返回数据,并存在响应体。
204 No Content 成功返回,但是没有响应体。
206 Partial Content 返回部分内容,往往适用于分块下载和断点续传,当然·也会带上相应字段Content-Range
3XX:重定向状态,资源位置发生变动,需要重新进行请求。
301 Moved Permanently 永久重定向:网站会做缓存优化,下次再访问则直接跳转到重定向的那个网址。
302 Found 临时重定向:有网站劫持的风险
304:当协商缓存命中时会返回这个状态码。
4XX:请求报文有误。
5XX:服务端发生错误。
URI
URL+URE
仅支持ASCII码,所有不支持的将被转化为16进制字节值
头部字段
Accept(请求头)
用于告知发送方,你支持什么样的接收方式
Accept字段常用的功能有如下四个部分:
数据格式、压缩方式、支持语言、字符集
Content(响应头)
定长字段
Content-Length
必须完全符合所发送的字符长度,过长则无法返回,过短则字符串被截取
不定长字段
Transfer-Encoding: chunked
表示分块传输数据,设置这个字段后Content-Length字段会被自动忽略,基于长连接持续推送动态内容。
两种表单提交的方式
x-www-form-urlencoded
其中的数据会被编码成以&分割的键值对
字符以URL编码方式编写
multipart/form-data
将不同的表单元素拆分开,且每个单元浏览器会自动添加特定的boundary,对于文件、图片等资源的上传,因为没有必要做URL编码,因此减少消耗,减小占用空间按
队头阻塞问题
HTTP从1.0版本升级到1.1版本之后,改变了每次请求都需要三次握手四次挥手的繁琐操作,HTTP1.1采用管道化的方式,允许客户端在已发送请求之后,响应请求之前发送下一个请求,借此来减少等待时间和吞吐量。
但是由于管道化的特定需求,服务端响应顺序必须与发送端相对应(FIFO)
支持管道化的请求必须是幂等请求(GET、OPTION)
解决办法:
- 并发连接,以chrom为例,一个域名下可以存在多个长连接,只需要增加队列数目来解决
- 可以采用域名分片,将域名分出多个二级域名
HTTP1.0和1.1的区别
- 连接方面: http1.0 默认使用非持久连接,而 http1.1 默认使用持久连接。http1.1 通过使用持久连接来使多个 http 请求复用同一个 TCP 连接,以此来避免使用非持久连接时每次需要建立连接的时延。
- 资源请求方面:在 http1.0 中,存在一些浪费带宽的现象,例如客户端只是需要某个对象的一部分,而服务器却将整个对象送过来了,并且不支持断点续传功能,http1.1 则在请求头引入了 range 头域,它允许只请求资源的某个部分,即返回码是 206(Partial Content),这样就方便了开发者自由的选择以便于充分利用带宽和连接。
- 缓存方面,在 http1.0 中主要使用 header 里的 If-Modified-Since、Expires 来做为缓存判断的标准,http1.1 则引入了更多的缓存控制策略,例如 Etag、If-Unmodified-Since、If-Match、If-None-Match 等更多可供选择的缓存头来控制缓存策略。
- 新增了请求方法
- host字段
HTTP1.1和2.0的区别
- 二进制协议
- 多路复用
- 数据流
- 头信息压缩
- 服务器推送
浏览器输入网址之后发生了什么
解析URL→查找缓存→DNS→获取MAC地址→TCP三次握手→HTTPS握手(TLS四次握手)→返回数据→解析页面→TCP四次挥手
TLS加密原理(先非对称后对称加密)
TCP/IP协议
TCP/IP协议往往指的是互联网协议的统称
数据处理流程
区分不同的通信
IP
网络标识+主机标识
通过网络标识来标记不同网段
TCP和UDP协议的区别
UDP:
- 无连接协议,想发就发,不会预先打招呼
- 有单播、多播、广播的功能,不仅仅支持一对一传输
- 面向报文,即UDP对应用层传递过来的报文既不合并也不拆分
- 不可靠性,即UDP不会根据网络情况调整发送速率,也不会检查数据包是否发送成功
- 头部开销小,仅仅有8字节,相比于TCP头部的至少20字节来说确实小了很多。
TCP:
- 面向连接,发送数据前两端必须事先建立连接。
- 仅支持单播
- 面向字节流,会将应用层的报文进行拆分以字节流的方式进行发送
- 可靠数据传输,能够确定发送顺序,是否丢包,按照当前网络拥塞情况调整发送速度。
- 拥塞控制
- 全双工通信
TCP重传机制
- 基于计时器
- 基于ACK确认序号
三次握手
三次握手的目的主要是建立TCP连接,确认双发的收发状态,同步发送双方的序列号和确认号,交换TCP窗口大小信息。
- SYN同步位,1表示进行连接请求,0表示不进行
- ACK确认位,1表示确认有效,0表示确认无效
- ack确认号,一般等于对方发送过来的序号+1
- seq序列号,起初是随机的,之后等于对方发送过来的确认号