协议
协议分层
解耦合
封装
协议分层之后,各层协议需要分工
有一类协议叫做“自定制协议”
客户端给服务器发送到信息是啥格式
服务器返回给客户端的信息是啥格式
1.请求(request)和响应(response)中包含的信息有哪些
2.请求数据和响应数据如何组织(具体按照啥格式来序列化)
序列化:把对象变成字符串
反序列化:把字符串变成对象
序列化的常见方式:
1.xml
2.json: 优点:方便调试
缺点:传输效率低
HTTP协议:
HTTPS其实是基于HTTP实现的,多了一个加密层
url: 网址/链接
ip地址不方便记忆,用字符串来表示域名,浏览器在访问域名的时候会自动把域名转成ip地址
路径表示主机上的具体的资源(文件或者虚拟的文件)
查询字符串(query_string)中的键值对都是用户自定制协议的一部分
urlencode:query_string如果包含了一些特定字符,都需要进行转义%[十六进制数字]
抓包工具,收费站
HTTP请求
1.首行
a) 方法 GET/POST/PUT/DELETE/…
b) url
c) 版本号 HTTP/1.1 HTTP/2.0 HTTP/3.0
三个部分之间使用空格分隔
2.协议头(header)
若干个键值对
每个键值对各占一行,每个键和值之间使用 :分隔
3.空行
表示header到这里就结束了
4.协议正文(body)
一般GET请求没有body,POST请求才有
HTTP响应格式
1.首行
a)版本号
b)状态码
c)状态码描述信息
2.协议头(header)
仍然是一组键值对
每个键值对占一行
每个键和值之间使用 :分割
3.空行
header部分的结束标记
4.协议正文(body)
一般GET请求没有body,POST请求才有
1.常用的方法有哪些?
GET,POST,PUT,DELETE,HEAD,OPTION…
2.GET和POST的区别是啥?
GET请求往往把自定制数据放在query_string中
POST请求往往把自定制数据放在body中、
3.常见的状态码有哪些?
a) 200 OK 表示访问成功
b) 302 Found 表示重定向
c) 404 Not Found 没找到指定资源
d) 403 Forbidden 没有权限
e) 502 Bad Gateway 服务器挂了
f) 504 Gateway Timeout 服务器响应超时
2xx 表示访问成功
3xx 表示重定向
4xx 表示客户端出错
5xx 表示服务器出错
4.常见的header有哪些?
a) Content-Type: 描述了 body的数据格式类型
b) Content-Length:描述了body的数据长度
c) Host:描述了访问的主机名(域名/ip)
d) Referer:当前页面是从哪个页面跳转过来的
e) Cookie:字符串,浏览器的本地存储的能力之一
经常会包含一直能够叫做“身份标识”的信息
session id
session :服务器端维护的一个数据结构,记录了用户的身份信息,session id就是session对象的唯一身份标识,session id保存在浏览器中,浏览器后序再访问服务器的时候,就会自动带着session id,从而让服务器知道当前请求是哪个用户发来的
服务器端使用一个hash table 之类的结构来维护若干个用户的身份信息,key就是session id,value就是完整的session对象
Cookie 是按照Host这个header来划分的
传输层
传输层负责 端到端之间的传输源ip/源端口目的ip/目的端口ip地址,是一个32位的整数,IP协议中来描述的(网络层)端口号,区分一台主机上的哪个程序,是一个16位的整数(传输层)端口号有效范围:0 ~ 65535冗余:加强了可靠性,但是降低了数据一致性(异地多活)例如:网线内部8根线UDPTCP无连接有连接不可靠可靠传输面向数据报(不能够灵活的控制读写数据的次数和数量)面向字节流全双工全双工UDP 1丶 UDP长度上限是64kb 2丶UDP检验和(校验和) 3丶UDP校验和使用了一种很简单粗暴的CRC校验 4丶取每个字节,把每个字节的数据依次循环相加,得到一个最终的数字,就是校验和 5丶接收端按照同样的规则再次计算校验和,和发送端的校验和进行对比,如果数据一致,就可以认为数据没有发生错误TCP设计核心
* 可靠性:发送者能知道自己发送成功没成功
* 传输效率:可靠性的前提下尽量提高传输效率
确认应答(ACK) 保证可靠性的核心机制为了区分当前是应答哪个数据,需要引入序号和确认序号概念序号是给每个字节都编了号确认序号表示的是当前序号之前的数据,已经收到了同时也意味着向发送端索要当前确认序号开始前的数据超时重传机制 传输一条数据没有确认应答的时候,等待一段时间,然后进行重传,重传可能会重复若干次,重传的次数越多,丢包的概率也就越小,重传的等待时间间隔,也在变长连接管理 三次握手建立连接 四次挥手断开连接建立连接的意义:
* 双方各自试探对方是否适合建立连接,双方的书写数据的能力
* 双方可以在建立连接的过程中协商一些必要的数据,TCP的序号的基准值
三次握手具体过程:(SYN 和 ACK )(都是由内核)
* 客户端先发起一个建立连接的请求(SYN 同步报文段),服务器收到SYN后会立刻返回一个确认报文段ACK,同时回复的这个ACK也是一个SYN,客户端收到SYN也会返回一个ACK
涉及到的重要状态:
* LISTEN状态,服务器端的状态,表示随时可以建立连接
* ESTABLISHED状态,表示连接已经建立,随时可以通信
四次挥手断开连接:(FIN 和 ACK)主动方可以是客户端也可以是服务器端ACK 是一收到FIN,内核立刻回复FIN 是程序中调用socket对象的close方法时才会发送CLOSE_WAIT:等待程序调用close来完成最终的断开连接过程如果一个服务器上出现大量的CLOSE_WAIT是啥情况?因为代码里有bug,代码里的close忘记调了,或者没有执行到TIME_WAIT:虽然此时程序可能已经结束了,但是还要保持连接为TIME_WAIT状态一段时间,因为发送的最后一个ACK可能会丢包(还没处理)TIME_WAIT等待时间是2MSL(120秒)MSL成为网络上两个主机之间数据传输的理论最大时间,在Centos7上默认是60秒滑动窗口
* 窗口:不等待ACK的情况下批量发送多少数据
* 滑动:每次收到一个ACK之后,就依次发送下一条数据,等待ACK的数据区间就在往后移动
* 窗口越大,传输效率越高
* 可靠性,如果窗口无限大,那么接收端可能处理不来,网络环境也可能承载不了
如果在滑动窗口过程中丢包了怎么办?1丶如果ACK丢了,不用管,确认序号表示的含义是当前序号之前的数据都收到了,后一个ACK能涵盖前一个ACK的含义2丶如果是数据丢了,接收端就会反复尝试索要该丢掉的数据,重复如干次之后,发送端就会认为丢包了,并重传对应的数据,而对于已经发送成功的数据,则没必要再重传流量控制:限制滑动窗口大小的一种机制(根据接收端的处理能力来进行限制)接收缓冲区接收缓冲区剩余空间越大,处理能力越强接收缓冲区剩余空间越小,处理能力越弱拥塞控制:根据网络的拥堵情况,来限制发送端的发送速率
* 试探式的方式:刚开始先使用比较小的滑动窗口,如果没丢包,说明网络畅通,增大滑动窗口,如果丢包,说明网络拥堵,减小滑动窗口
发送端真实的滑动窗口大小 = min(流量控制中的窗口大小,拥塞窗口)延时应答:提高传输效率的方式(尽可能的提高窗口大小)
* 延时应答导致延时时间中,接收端的程序已经处理了一部分数据,此时ACK中的窗口大小就更大了
捎带应答:延时应答的基础上,再提高传输效率
* 延时应答的基础上,把应用程序发送的业务数据和系统发送的数据合二为一
可靠性
* 确认应答
* 超时重传
* 连接管理
传输效率
* 滑动窗口(流量控制(延时应答(捎带应答)) 拥塞控制)
面向字节流粘包问题(面向字节流导致的问题)
网络层(快递小哥)
网络层(全局)最核心的协议是IP 协议 IPV4 IPV61丶地址管理 使用一个32位的整数来表示地址 IP地址2丶路由选择
* 动态分配
* NAT机制,一个IP供多个主机来使用
* IPV6
32位整数不方便,所以表示成点分十进制(123.139.84.33)网段划分
* 把一个IP地址分成网络号和主机号(同一个局域网网络号相同,主机号不同)
* 相邻的两个局域网,网络号不能相同
* 局域网之间使用路由器连接,一个路由器往往拥有多个IP地址
如何区分网络号和主机号?通过子网掩码来区分,子网掩码也是一个32位整数,同样也可以表示成点分十进制,要求高位必须为1,低位必须为0
怎么求网络号?
192.168.128.10/255.255.255.0 => 24(24个1)
按位与结果 -> 192.168.128.0 就是网络号
私有ip上搭建的服务器通常情况下只能在局域网内部访问
公网ip上搭建的服务器才能被任何设备访问(云服务器)
路由选择
两个主机之间要进行通信,需要找到一条合适的路径
六度空间
TTL 默认值叫64,问路的时候最多问64次
数据链路层
数据链路层(局部):负责两个相邻节点如何传输数据
MAC地址:表示互联网上的唯一一个主机
6个字节表示 mac 地址
以太网,不光规定了数据链路层的内容也规定了物理层的内容
1.源mac
2.目的mac
3.类型
MTU表示一个数据链路层数据帧的最大长度
以太网的MTU 1500字节
MTU会导致IP数据报分包
MTU对于传输层有没有影响
不同的数据链路层协议对于MTU的值是不同的
ARP协议 RARP协议