网络基础知识
OSI七层协议
- 物理层主要定义物理设备标准,主要作用是传输Bit流,网卡工作这这层中
- 数据链路层,在传输bit流的过程中会产生错传、数据传输不完整的可能,因此数据链路层定义如何格式化数据,以及如何控制对物理介质的访问,本层将bit数据组成了帧,其中交换机在本层工作,对帧解码,并根据帧中的信息把消息发送到正确的接收方
- 网络层,主要功能将网络地址翻译成对应的物理地址,路由器数据网络层,此层的数据称为数据包,此层的协议为IP协议
- 传输层,传输层解决了主机间的传输,并且解决了传输质量,协议有TCP/UDP
- 会话层,建立和管理应用程序之间的通信
- 表示层,解决不同系统之间的通信语法问题
- 应用层,更方便的应用层网络接收到的数据 http协议
TCP/IP
OSI的实现:TCP/IP四层网络模型
TCP/IP是协议族的统称
TCP的三次握手与四次挥手
TCP简介:
- 面向连接的、可靠的、基于字节流的传输通信协议
- 将应用的数据流分割成报文段并发送给目标节点的TCP层
- 数据包都有序号,对方收到则发送ACK确认,未收到则重传
- 用奇偶校验和函数来检验数据在传输过程中是否有误
TCP三次握手流程
三次握手:首先客户端和服务器都是关闭状态,假设客服端主动打开,服务器被动打开
服务器先创建传输控块时刻准备接收连接请求,服务器进入listen监听状态,客户端发出连接请求报文,报文头syn=1,初始序号seq=x,此时客户端进入同步已发送状态,发送过去的报文段是不能携带数据的,并且会消耗掉一个序号,这是第一次握手
服务器接收到如果同意连接就发送确认报文,确认报文中包含了SYN=1,ACK=1,seq=y,ack=x+1,因为x序列号已经消耗,所以seq等于x+1,发送完成后服务器进入同步收到状态,这是第二次握手
当客户端收到确认报文后,会向服务端一个给出一个确认,ACK=1,seq=x+1,ack=y+1,发送完成后客户端进入已建立连接状态,这个报文段可以携带数据,如果不携带数据就不会消耗seq序号
当服务器收到确认后也会进入已建立连接状态,三次握手完成
总结
为什么需要三次握手才能建立连接
为了初始化Sequence Number的初始值
首次握手的隐患-sun超时
问题原因
- Server收到Client的SYN,回复SYN-ACK的时候未收到ACK确认
- Server不断重试直至超时,Liunx默认等待6秒才断开连接
- 可能会收到SYN Flood风险,恶意程序不停的发,让连接耗尽不能处理正常请求
针对SYN Flood的防护措施
SYN队列满后,通过tcp_syncookies参数回发SYN Cookie
若为正常连接则Client会回发SYN Cookie,直接建立连接
TCP的四次挥手
为什么会有Time_wait状态
原因
- 确保有足够的时间让对方收到ACK包
- 避免新旧连接混淆
为什么需要四次挥手才能断开连接
因为全双工,发送方和接收方都需要FIN报文和ACK报文
服务器出现大量CLOSE_WAIT状态的原因
对方关闭socket连接,我方忙于读或写,没有及时关闭连接
- 检查代码,特别是释放资源的代码
- 检查配置,特别是处理请求的线程配置