OSI 开放互联参考模型
七层协议
- 物理层 bit 网线类型 传输介质 10二进制数据转电流 数模转换 网卡工作
- 数据链路层 格式化数据进行传输 错误检测 纠正 帧 交换机
- 网络层 路由器 分组传输 ip协议 包
- 传输层 segment 传输质量 tcp udp 协议 分片 序列号
- 会话层 建立管理应用程序
- 表示层 不同通信系统能理解的解析
- 应用层 http协议
TCP/IP
- 应用层
- 传输层
- 网络层
- 链路层
TCP 三次握手
- tcp 传输控制协议
- 面向连接,可靠,基于字节流的传输层控制协议
- 应用层数据分割成报文段并发送给目标节点的tcp层
- 数据包都有序号,对方受到则发送ack确认,未受到就重传
- 使用奇偶校验和来检验是否错误
tcp 源端口 目的端口各占两个字节 不包括ip
进程信息交互:管道 内存共享 信号量 消息队列
进程号pid 本地唯一,通过协议端口号标识进程 套接字
序号字段 4个字节
ack字段 4个字节,期望受到的下一个报文的字段号
offset 偏移量
tcp flag
- urg 紧急指针标志
- ack 确认序号标志
- psh push标志
- rst 重置连接标志
- syn 同步序号 用于建立连接
- fin 释放连接用
window 滑动窗口
urgent pointer紧急指针
握手达到全双工通信 对等的
流程
- 开始都是close状态
- syn=1 seq=x
- syn=1 ACK=1 seq=y ack=x+1
- ACK =1 seq = x+1 ack = y+1
为什么需要三次握手?
- 初始化Sequence Number 初始值
首次握手隐患——SYN超时
- Server 受到Client SYN 回复SYN-ACK 时候未收到ACK确认
- Server 不断重试直至超时,LINUX 默认等待63秒才能断开连接
可能会SYN Flood攻击
- SYN 队列满,tcp_syncookies参数回发SYN cookie
- 正常连接则CLient 回发cookie ,才能建立连接
建立连接,Client出现故障怎么办
保活机制
- 向对方发送保活探测报文,如果未收到响应则继续发送
- 尝试次数达到探测数仍未受到响应则中断连接
四次挥手
终止tcp连接
- FIN =1 seq=u
- ACK = 1,seq=v,ack=u+1 半关闭
- FIN = 1 ACK=1 seq=w ack = u+1
- ACK=1,seq=u+1,ack=w+1
- 客户端等待2 MSL 真正释放 linux 20s 服务器直接关闭连接
为什么有TIME_WAIT状态
- 确保有足够的时间让对方受到ACK包
- 避免新旧连接混淆
为什么需要四次挥手?
- 全双关,双方都需要FIN ACK报文 2*2=4
服务器大量CLOSE_WAIT
- 对方关闭socket连接 我方由于忙于读写 没有及时关闭连接
- 检查代码,特别是释放资源的代码
- 检查配置,特别是处理请求的线程配置
- netstat -n | awk ‘/^tcp{++$[NF]}END{for(a in S) print a,s}/’ 获取服务器下处于各个状态的连接数 检查CLOSE_WAIT 数量
TCP UDP区别
UDP报文
源端口 目的端口 长度 校验和 数据
特点
- 面向非连接
- 不维护连接状态,支持同时对多个客户端传输相同的消息
- 数据包报头只有8个字节,开销小
- 吞吐量不受传输控制算法限制,只和数据生成速率,传输速率,机器性能有关
- 尽最大努力交付,不保证可靠交付,不需要维持复杂的链接状态表
- 面向报文,不对应用程序提交的报文信息进行拆分或者合并
区别
- tcp 可靠 udp速度
- 连接 无连接
- 握手 多播放
- 有序保证 不保证
- 速度
滑动窗口
- RTT RTO
- RTT 发送包到受到ACK的时间
- RTO 重传间隔
TCP使用滑动窗口做流量控制和乱序重排
- 保证TCP 流控特性
- 保证有效性
发送方
- 发送且收到
- 发送未受到 发送窗口
- 没法但是在窗口允许范围的 发送窗口
- 超过范围不能发送的
接受
- 已经接受
- 没接受但是准备接受
- 不能接受
确认重传机制
滑动窗口可以调整
HTTP
超文本传输协议
1.1 持续连接
- 支持客户/服务器模式
- 简单快速
- 灵活
- 无连接
- 无状态
报文
- 请求行
- 请求头
- 请求体
http响应
- 状态行
- 响应头部
- 响应体
http简介
web 服务器和客户端传输数据
响应步骤
- 客户端连接到web服务器
- 发送http请求
- 服务器接收并返回http响应
- 释放tcp连接
- 客户端浏览器解析html内容
url地址栏输入url流程
- dns解析 浏览器缓存 系统缓存 路由器缓存 ips缓存 根域名服务器缓存 顶级域名服务器缓存
- tcp 连接 三次握手
- 发送HTTP请求
- 服务器返回HTTP报文
- 浏览器解析页面
- 连接结束
HTTP 状态码
1xx 接收,继续处理
2xx 成功接受并处理
3xx 重定向
4xx 客户端错误——语法错误或者找不到页面
5xx 服务器端错误 原因类似
200 ok 正常
400 客户端请求有语法错误
403 被禁止
404 资源不存在
500 服务器不可预期的错误
503 服务器不能处理,一段时间恢复
get post 请求的区别
- Http get 请求信息在url 有长度限制 post 放在报文体中 没有限制
- 数据库 get符合幂等性 一次多次结果三一样的 安全性 post不会
- 其他 get 可以浏览器缓存 存储 post不会缓存
Cookie Session区别
- 服务器发送给客户端的特殊信息,以文本形式存放在客户端
- 客户再次请求,直接携带cookie回发
- 受到后解析cookie得到对应的内容
cookie设置 发送过程
session
-
服务器机制,保存信息
-
解析客户请求并操作session id 按需要保存状态信息
-
实现
- cookie实现 为主
- url回写 cookie禁止后使用
cookie session
-
0 cookie 浏览器 session服务器
-
session相对于cookie更安全
-
减轻负担 使用cookie
HTTP HTTPS区别
- 加入ssl层 更加安全
SSL 安全套接层
- 网络通信提供的安全协议
- 身份验证和数据加密
加密方式
- 对称加密
- 非对称加密 公钥私钥
- 哈希算法 任意长度转换固定长度md5
- 数字签名 证明信息没有改
数据传输流程
- 浏览器支持加密算法发送给服务器
- 服务器选择一套浏览器支持的加密算法,以证书形式回发浏览器
- 浏览器证书合法性,结合证书公钥加密信息发送给服务器
- 服务器使用私钥,验证哈希,加密信息回发浏览器
- 浏览器响应信息,对消息进行验证,之后进行加密交互数据
Http https区别
- https 需要ca申请证书 http 不需要
- s加密传输 明文传输
- 连接方式不同s 442 http 80
- https 在http基础上加密 认证 完整性保护 更加安全
真的安全吗?
- 默认填充http:// 请求需要跳转,有被劫持的风险
- hsts优化之