OSI七层协议:
自底而上:
- 物理层:
A向B发送比特流,B进行接收。主要定义了物理设备的标准:如网线的类型,光纤接口类型,各种传输介质的传输速 率等。主要作用是传输比特流:即所谓的01二进制数据,转换为电流强弱,到达目的地之后再转换为10,01的机器码。
数模转换与模数转换。
- 数据链路层:
交换机工作在这一层。交换机对帧解码,把数据发送到正确的接收方。
- 网络层:
将网络地址翻译为对应的物理地址,选择最佳路径。控制子网的运行,如逻辑编址、分组传输、路由选择。
- 传输层:
接收上一层的数据,必要时进行分割,并将这些数据交给网络层,且保证这些数据段有效到达对端。
- 会话层:
不同机器上的用户之间建立及管理会话。
- 表示层
信息的语法语义以及他们的关联,如加密解密、转换翻译、压缩解压缩。
- 应用层
传输控制协议TCP简介:
1.面向连接的、可靠的、基于字节流的传输层通讯协议。
2.将应用层的数据流分割成报文段并发送给目标节点的TCP层
3.数据包都有序号,对方收到则发送ACK确认,未收到则重传。
4.使用校验和来校验数据在传输过程中是否有误。
TCP flags
URG:紧急指针标志
ACK:确认序号标志
PSH:push标志
RST:重置连接标志
SYN:同步序号,用于建立连接过程
FIN:finish标志,用于释放连接
- TCP三次握手:
在TCP/IP协议中,TCP协议提供可靠的连接服务,采用三次握手建立一个连接
第一次握手:建立连接时,客户端发送SYN包【syn=j】到服务器,并进入SYN_SEND状态,等待服务器确认;
第二次握手:服务器收到SYN包,必须确认客户的SYN【ack=j+1】,同时自己也发送一个SYN包【syn=k】,即SYN+ACK包,此时服务器进入SYN_RECV状态;
第三次握手:客户端收到服务器的SYN+ACK包,向服务器发送确认包ACK【ack=k+1】,此包发送完毕,客户端和服务器进入ESTABLISHED状态,完成三次握手。
为什么需要三次握手才能建立起连接:
为了初始化Sequence Number的初始值。
首次握手的隐患-----SYN超时:
Server收到Client的SYN,回复SYN-ACK的时候未收到ACK确认;
Server不断重试直至超时,Linux默认等待63秒(1+2+4+8+16+32)才断开连接
针对SYN Flood的保护措施:
SYN队列满后,通过tcp-syncookies参数回发SYN Cookie
若为正常连接则Client会回发SYN Cookie,直至建立连接。
建立连接后,Client出现故障怎么办?
保活机制:
1.向对方发送保活探测报文,如果未收到响应则继续发送
2.尝试次数达到保活探测数仍未收到响应则中断连接。
- TCP的四次挥手
“挥手”是为了终止连接。
第一次挥手: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状态,完成四次挥手。
- 为什么会有TIME_WAIT状态:(2MSL)
原因:确保有足够的时间让对方收到ACK包
避免新旧连接混淆
- 为什么需要四次挥手才能断开连接?
因为全双工,发送方和接收方都需要FIN报文和ACK报文。
- 服务器出现大量CLOSE_WAIT状态的原因?
对方关闭socket连接,我方忙于读或写,没有及时关闭连接
解决:1.检查代码,特别是释放资源的代码。2.检查配置,特别是处理请求的线程配置。