Open xinrong2019 opened 5 years ago
TCP是全双工的,A给B发送数据的时候,B也可以同时给A发
第一次握手:建立连接时,客户端发送SYN包(seq=x)到服务器,并进入SYN_SEND状态,等待服务器确认;
第二次握手:服务端接收到SYN包,必须确认客户的SYN(ack=x+1),同时自己也发送一个SYN包(seq=y),即SYN+ACK包,此时服务器进入SYN_RECV状态;
第三次握手:客户端收到服务器的SYN+ACK包,向服务器发送确认宝ACK(ack=y+1),此包发送完毕,客户端和服务器进入ESTABLISHED状态,完成三次握手。
为了初始化Sequence Number的初始值,TCP利用这个序号拼接数据,保证数据顺序
问题起因分析:
Server收到Client的SYN,回复SYN-ACK的时候未收到ACK确认
Server不断重试直至超时,Linux默认等待63秒才断开连接
SYN队列满后,通过tcp_syncookies参数回发SYN Cookie
若为正常连接则Client会回发SYN Cookie,直接建立连接
保活机制
向对方返送保活探测报文,如果未收到响应则继续发送
尝试次数达到保活探测数仍未收到响应则中断连接
IP协议回顾
IP协议是无连接的通信协议,不会占用正在通信的通信线路,IP降低了对网络线路的需求,每条线,可以同时满足许多计算机通信需要,通过IP,消息会被分割为较小的独立的包,通过Internet在计算机间传送,IP负责将包路由到目的地,除此之外不做多余的事情,不会确认数据包是否按顺序发送,或者包是否被破坏,所以IP数据包不可靠,需要上层传输层协议控制。
传输控制协议TCP简介:
面向连接的、可靠的、基于字节流的传输层通信协议
将应用层的数据流分割成报文段并发送给目标节点的TCP层
数据包都有序号,对方收到则发送ACK确认,未收到则重传
使用校验和来检测数据在传输过程中是否有误。
TCP报文头的数据结构
TCP和UDP报文头格式
TCP Flags
URG:紧急指针标志
ACK:确认序列号
PSH:push标志
RST:重置连接标志
SYN:同步序号,用于建立连接过程
FIN:finish标志,用于释放连接
TCP建立连接时的三次握手