知己知彼,将心比心。——《增广贤文·上集》
网络基础
OSI模型
表格
概念层 | 数据单位 | 作用 | 设备 |
---|---|---|---|
物理层 | 比特 | 提供光纤标准、传送数据的通路,传输比特流 | 网线等等 |
数据链路层 | 数据帧 | 帧定界和帧同步;顺序控制,指对帧的收发顺序的控制;差错检测和恢复;APR、RARP协议 | 交互机、网桥 |
网络层 | 数据分组或数据包 | 两个主机系统之间提供连接和路径选择 | 路由器 |
传输层 | 报文段 | 定义传输协议和端口;分段传输,到达目的地址后重组 | - |
会话层 | - | 管理应用程序间的通信 | - |
表示层 | - | 把应用层提供的信息变换为能够共同理解的形式、保证各系统、应用可以读取 | - |
应用层 | - | 应用层协议,如HTTP协议 | - |
总结
- 下面4层(物理层、数据链路层、网络层和传输层)主要提供数据传输和交换功能,即以节点到节点之间的通信为主;
- 第4层(传输成TCP/UDP)作为上下两部分的桥梁,是整个网络体系结构中最关键的部分;
- 简言之,下4层主要完成通信子网的功能,上3层主要完成资源子网的功能。
TCP/IP四层模型
TCP/IP 又叫网际协议群,可以说是OSI模型的实现,强调在计算机上实现协议应该开发哪种程序
概念层 | TCP/IP 协议群 |
---|---|
应用层 | FTP、HTTP、Telnt |
数据链路层 | TCP、UDP |
网络层 | IP、ICMP、RIP、OSFF,ICMP,BGF |
网络接口层/链路层 | ISO、IEEE标准 |
TCP三次握手&四次挥手
报文格式
TCP Tags
- URF 紧急指针标志
- ACK 确认序号标志
- PSH push标志
- RST 重置连接标志
- SYN 同步需要,用于建立连接过程
- FIN 完成标志,用于释放连接
三次握手
具体过程
一般由客户端发起连接请求
- 第一次握手(SYN=1, seq=x)
客户端发送一个 TCP 的 SYN 标志位置1的包。
发送完毕后,客户端进入SYN_SEND
状态。 - 第二次握手(SYN=1, ACK=1, seq=y, ack=x+1)
服务器发回确认包(ACK)应答。SYN 标志位和 ACK 标志位均为1。
发送完毕后,服务器端进入SYN_RCVD
状态。 - 第三次握手(ACK=1,seq=x+1,ack=y+1)
客户端再次发送确认包(ACK)。SYN 标志位为0,ACK 标志位为1
发送完毕后,客户端进入ESTABLISHED
状态,当服务器端接收到这个包时,也进入ESTABLISHED
状态,TCP 握手结束。
为什么需要三次握手才能建立起连接
- 为了初始化seq number,作为以后数据传输的序号,保证数据传输过程中数据不会乱序
首次握手隐患-SYN超时
- Server收到Client的SYN,回复SYN-ACK的时候未收到ACK
- Server不断重试直至超时
- 攻击者可以把SYN的队列耗尽,使正常请求无法处理
SYN Flood防护措施
- SYN队列满后,通过tcp_syncookies参数回发SYn Cookie
- 若为正常连接则Cliet会回发SYNCookie,直接建立连接
建立连接后,Client出现故障
- 向对方发送保活探测报文,如果未收到响应则继续发送,直到保活探测数
四次挥手
具体过程
- 第一次挥手(FIN=1,seq=u)
Client发送一个FIN包,迎来关闭Client到Server的数据传送。
发送完毕后,客户端进入FIN_WAIT_1
状态。 - 第二次挥手(ACK=1,seq=v,ack=u+1)
Server收到FIN包,发送一个ACK到Client,确认序号为收到序号+1。
发送完毕后,服务器端进入CLOSE_WAIT
状态。
客户端接收到这个确认包之后,进入FIN_WAIT_2
状态,等待服务器端关闭连接。 - 第三次挥手(FIN=1,ACK=1,seq=w,ack=u+1)
Server发送一个FIN包,用来关闭Server到Client的数据传送。
发送完毕后,服务器端进入LAST_ACK
状态,等待来自客户端的最后一个ACK。 - 第四次挥手(ACK=1,seq=u+1,ack=w+1)
Client收到FIN包后,Client进入TIME_WAIT
状态,接着发送一个ACK包给Server,确认序号为收到序号+1。
服务器端接收到这个确认包之后,关闭连接,进入CLOSED
状态。 - 客户端等待了某个固定时间(两个最大段生命周期,2MSL,2 Maximum Segment Lifetime)之后,没有收到服务器端的 ACK ,认为服务器端已经正常关闭连接,于是自己也关闭连接,进入
CLOSED
状态。在等待过程中,可以使本连接持续的时间内所产生的所有报文段从网络中消失。这样就可以使下一个新的连接中不会出现旧的连接请求报文段。
为什么需要四次握手才能断开连接
- 因为全双工,发送发和接收方都需要FIN报文和ACK报文
服务器出现大量CLOSE_WAIT状态的原因
- 对方关闭socket连接,我方忙于读与写,没有及时关闭连接
- 检查代码,特别是释放资源的代码
- 检查配置,特别是处理请求的线程配置
TCP和UDP区别
UDP简介
- 面向非连接
- 不维护连接状态,支持同时向多个客户端传输相同的消息
- 数据包报头只有8哥字节,额外开销小
- 吞吐量之受限于数据生成速率、传输速率以及机器性能
- 尽最大努力交付,不保证可靠交付,不需要维持复杂的链接状态表
- 面向报文,不对应用程序提交的信息进行拆分或者合并
TCP和UDP的区别
- 面向连接VS无连接(适用于多端发布)
- 可靠性
- 有序性
- 速度
- 量级
TCP的滑动窗口
TCP使用滑动窗口做流量控制与乱序重排
- 保证TCP的可靠性
- 保证TCP的流控特性
RTT和RTO
- RTT 发送一个数据包到收到对应的ACK,所花费的时间
- RTO 发送时间间隔(根据RTT计算)
HTTP与HTTPS
http特点
- 支持客户/服务器模式
- 简单快速
- 灵活
- 无连接(即使http1.1的keep-live机制,属于http之外的,始终认为请求结束后关闭连接,下层实现对上层透明)
- 无状态
http响应步骤
- 客户端连接到Web服务器
- 发送http请求
- 服务器接收请求并返回HTTP响应
- 释放连接TCP连接
- 客户端浏览器解析HTML内容
在浏览器地址栏键入URL回车流程
- DNS解析
- TCP连接
- 发送HTTP请求
- 服务器处理请求并返回HTTP报文
- 浏览器解析渲染页面
- 连接结束
常见HTTP状态码
- 1XX 指示信息:表示请求已接受,继续处理
- 2XX 成功:表示请求已被成功接收、理解、接受
- 3XX 重定向:要完成请求必须进行更进一步的操作
- 4XX 客户端错误:请求用语法错误或请求无法实现
- 5XX 服务器端错误:服务器未能实现合法的请求
GET和POST请求的区别
- HTTP报文层面:GET请求信息放在URL,POST放在报文体中
- 数据库层面:GET符合幂等性和安全性,POST不符合
- 其他层面:GET可以被缓存、被存储,而POST不行
Cookue和Session的区别
- Cookie数据存放在客户的浏览器上、Seession数据放在服务器上
- Session相对于Cookie更安全
- 若考虑减轻服务器开销,应当考虑Cookie
HTTP和HTTPS的区别
SSL(TLS) 安全套接层
- HTTPS需要到CA申请证书,HTTP不需要
- HTTPS密文传输,HTTP明文传输
- 连接方式不同,HTTPS默认使用443端口,HTTP使用80端口
- HTTPS=HTTP+加密+认证+完整性保护,较安全
HTTPS并不绝对安全
- 浏览器默认填充http://,请求需要进行跳转,有被劫持的风险
- 可以使用HSTS优化