Computer Network.
五层模型 | 个体单位 | 协议 | 作用 | 设备 |
---|---|---|---|---|
物理层 | 比特/比特流 | / | 定义物理传输设备标准 | 网卡 |
数据链路层 | 帧 | / | 定义如何格式化数据,提供错误检测 | 交换机 |
网络层 | 数据包 | IP | 将网络地址翻译成物理地址 | 路由器 |
传输层 | 数据段 | TCP/UDP | 解决主机间的数据传输与传输质量(最重要) | 进程和端口 |
应用层 | 报文 | DNS/FTP/HTTP | 文件传输,电子邮件 | / |
三次握手
TCP Flags
URG:紧急指针标志(1表示紧急指针有效 0表示忽略紧急指针)
ACK:确认序号标志(1表示有效 0表示报文中不包含确认信息 忽略确认号字段)
PSH:push标志(1表示带有push数据应尽快将该报文交给应用程序)
RST:重置连接标志(重置由于主机崩溃的错误连接 或 用于拒绝非法报文段或非法请求)
SYN:同步序列号(建立连接过程 SYN=1 ACK=0表示该数据没有使用捎带的确认域 连接应答捎带的SYN=ACK=1)
FIN:finish标志,用于释放连接 唯一时表示发送方没有数据发送了 可以关闭本方数据流
Procedure
首次通信 客户端主动打开连接 服务端被动打开连接 服务进程创建传输控制块TCB 准备接受客户进程发送的请求 服务端进入listen状态 客户端发送syn=1即等待建立连接 同时发送一个SYN包(seq=x) 并进入SYN-SENT状态 该报文段成为syn报文段 不存储数据 需要消耗一个序号
服务端接收到请求报文后 则发出确认报文(SYN=1 ACK=1) 同时确认客户的SYN(ack=x+1) 自己也发送一个SYN包(seq=y) 即SYN+ACK包 此时服务器进入SYN-RECV状态
客户端还要给服务端一个确认报文 回应的ack=y+1 seq初始为x 那这个就是x+1了 可携带也可不携带数据 这样客户端和服务器端一起进入ESTABLISHED状态 完成三次握手
现在TCP连接建立。
For what
- 为了初始化Sequence Number的初始值(x和y) 保证不会因为网络问题乱序 因此需要三次握手才建立连接
- 首次握手的隐患的隐患:
- server收到client的SYN 回复SYN-ACK的时候未收到ACK确认(第三次握手gg了)
- server不断重试直至超时 linux默认等待63秒才断开连接(1+2+4+8+16+32)(linux默认五次)
- 针对SYN Flood的防护措施
- SYN队列满后 通过tcp_syncookies参数回发SYN Cookie
- 若为正常连接则client会回发SYN Cookie 直接建立连接
- 已经建立连接后client出现故障:
- 向对方发送保活探测报文 如果未收到响应则继续发送
- 尝试次数达到保活探测数仍未受到相应则中断连接
保活机制
四次握手
Procedure
client发送一个FIN 用来关闭client到server的数据传送 client进入FIN_WAIT_1状态
server收到FIN后 发送一个ACK给client 确认序号为收到序号+1(与SYN相同 一个FIN占用一个序号) server进入CLOSE_WAIT半关闭状态
server发送一个FIN 用来关闭server到client的数据传送 server进入LAST_ACK状态
client收到FIN后client进入TIME_WAIT状态 接着发送一个ACK给server 确认序号为收到序号+1 server进入closed状态 完成四次挥手
现在TCP连接终止。
For what
- 为何会有TIME_WAIT状态
- 确保有足够时间让对方收到ACK包(第四次挥手)
- 避免新旧连接混淆(路由器缓存)
- 为何需要四次握手才能断开
- TCP全双工 发送方和接收方都需要FIN报文和ACK报文
- 各只需要两次握手即可 不过有一方是被动的
- 服务器出现大量CLOSE_WAIT状态原因
- 对方关闭socket连接 我方忙于读或写 没有及时关闭连接
- 检查代码 特别是释放资源的代码
- 检查配置 特别是处理请求的线程配置
- 对方关闭socket连接 我方忙于读或写 没有及时关闭连接
TCP/UDP区别
UDP
- 面向非连接
- 不维护连接状态 支持同时向多个客户端传输相同的消息
- 数据包报头只有8个字节 额外开销较小
- 吞吐量只受限于数据生成速率 传输生成速率以及机器性能
- 尽最大努力交付 不保证可靠交付 不需要维持复杂的链接状态表
- 面向报文 不对应用程序提交的报文信息进行拆分或者合并
Difference
- 面向连接 vs 无连接
- 可靠性
- 有序性
- 速度(TCP较慢 需要做可靠性检测)
- 量级(TCP20个字节 UDP8个字节)
TCP的滑窗
RTT和RTO
- RTT:发送一个数据包到收到对应的ACK 所花费的时间
- RTO:重传的时间间隔
Sliding Window
- 保证TCP的可靠性
- 保证TCP的流控特性
HTTP相关
特点
- 支持客户/服务器模式
- 简单快速(规模小)
- 灵活(允许传输任意类型数据对象)
- 无连接(限制每次连接只处理一个请求)
请求/相应步骤
- 客户端连接到WEB服务器
- 发送HTTP请求
- 服务器接收请求并返回HTTP相应
- 释放连接tcp链接
- 客户端浏览器解析html内容
浏览器输入URL后流程
- DNS解析
- TCP连接
- 发送HTTP请求
- 服务器处理请求并返回HTTP报文
- 浏览器解析渲染页面
- 连接结束
HTTP状态码
- 1xx:指示信息 表示请求已接收 继续处理
- 2xx:成功 表示请求已被成功接收 理解 接收
- 200 OK 整成返回信息
- 3xx:重定向 要完成请求必须进行更进一步的操作
- 4xx:客户端错误 请求有语法错误或请求无法实现
- 400 Bad Request 客户端请求有语法错误 不能被服务器所理解
- 403 Forbidden 服务器收到请求但是拒绝提供服务
- 404 Not Found 请求资源不存在 eg. 输入了错误的URL
- 5xx:服务器端错误 服务器未能实现合法的请求
- 500 Internal Server Error 服务期发生不可预期的错误
- 503 Server Unavailable 服务器当前不能处理客户端的请求 一段时间后可能恢复正常
Get和Post请求的区别
- http报文层面:get将请求信息放在url post放在报文体中
- 数据库层面:get符合幂等性(数据库一次操作 多次操作结果一样)和安全性 post不符合
- 其他:get可以被缓存被存储 而post不行
Cookie和Session的区别
Cookie简介
- 是由服务器发给客户端的特殊信息 以文本的形式存放在客户端
- 客户端再次请求的时候会把cookie回发
- 服务器接收到后 会解析cookie生成与客户端相对应的内容
Session简介
- 服务器端的机制 在服务器上保存的信息
- 解析客户端请求并操作session id 按需保存状态信息
Session实现方式
- 使用cookie来实现 服务器给每个session分配一个jsessionid
- 使用url回写来实现
Difference
- cookie数据存放在客户的浏览器上 session数据存放在服务器上
- session相对于cookie更安全
- 若考虑减轻服务器负担 应当使用cookie
Http与Https的区别
SSL(Security Socket Layer)
- 为网络通信提供安全及数据完整性的一种安全协议
- 是操作系统对外的API SSL3.0后更名为TLS
- 采用身份验证和数据加密保证网络通信的安全和数据的完整性
加密方式
- 对称加密:加密解密都是用同一个密钥
- 非对称加密:加密使用的密钥和解密使用的密钥是不相同的
- 哈希算法:将任意长度的信息转换为固定长度的值 算法不可逆
- 数字签名:证明某个消息或者文件时某人发出/认同的
Https数据传输流程
- 浏览器将支持的加密算法信息发送给服务器
- 服务器选择一套浏览器支持的加密算法 以证书的形式回发浏览器
- 浏览器验证证书合法性 并结合证书公钥加密信息发送给服务器
- 服务器使用私钥解密信息 验证哈希 加密相应消息回发给浏览器
- 浏览器解密响应消息 并对消息进行验证 之后进行加密交互数据
Difference
- https需要到CA申请证书 http不需要
- 前者密文传输 后者明文传输
- 连接方式不同 端口不同
- https = http + 加密 + 认证 + 完整性保护 较http安全