##TCP UDP协议
由于传输的时候可能出现掉包,顺序不一致,速度慢等情况,在不同的需求下使用不同的协议进行传输。
-
对于掉包和顺序等可靠性要求高的情况下
TCP
当使用可靠性能比较高的TCP协议,为什么TCP协议是可靠性高的协议先看看原理 -
tcp报文头
TCP Flags
UAG:紧急指针标志
ACK:确认序号标志
PSH:PUSH标志
RST:重置连接标志
SYN:同步序号,用于建立连接过程
FIN:finish标志,用于释放连接
一次完整的TCP通讯包括:建立连接、数据传输、关闭连接
- 建立连接 三次握手
第一次握手
客户端通过向服务器端发送一个SYN(Reserved 中的 SYN)=1,seq(sequence number)=x来建立一个主动打开。
第二次握手
服务器端应当为一个合法的SYN回送一个SYN/ACK=1,seq=y,ack=x+1。
第三次握手
最后,客户端再发送一个ACK=1,seq=x+1,ack=y+1。这样就完成了三路握手,并进入了连接建立状态。
三次握手的意义:TCP通过三次握手建立可靠的(确保收到)的全双工通信,并且同步连接双方的序列号和确认号并交换 TCP 窗口大小信息。
安全隐患:
SYN攻击 服务器接收到连接请求(syn=x),将此信息加入未连接队列,并发送请求包给客户(syn=y,ack=x+1),
此时进入SYN_RECV状态。当服务器未收到客户端的确认包时,重发请求包,一直到超时
(linux默认重发6次总共63秒), 才将此条目从未连接队列删除。引起网络堵塞甚至系统瘫痪。 针对SYN Flood防范
SYN队列满后,通过tcp_syncookies参数回发SYN cookie 若为正常连接client会回发SYN
cookie,建立连接
- 断开连接 四次挥手
第一次挥手:
client向server发送一个FIN,用来关闭client到server的数据传送,client进入fin_wait_1状态
第二次挥手
server收到FIN后,发送一个ACK给client,确认序号为收到的序号+1,server进入close_wait 状态
第三次挥手
server发送一个FIN,用来关闭server到client的数据传送,server进入last_ack状态
第四次挥手
client收到FIN后,client进入TIME_WAIT状态,接着发送一个ACK给server,确认序号为收到序号+1
server进入closed状态,完成四次挥手,
client端需要再等待2MSL保证对方收到发送后closed
出现大量CLOSE_WAIT状态,服务器忙于读写,没有及时关闭连接
代码,释放资源代码
配置,处理请求的线程配置
-
RTT/RTO
RTT: 发送一个数据包到收到对应的ACK,所花费的时间
RTO: 重传时间间隔(发送超时的时间间隔) -
滑动窗口
保证TCP的可靠性
保证TCP的流控特性