计算机网络学习笔记(一)
1. TCP/IP 三次握手
第一次握手:建立链接时,客户端发送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的初始值。
首次握手的隐患:SYN超时,在linux环境下超时会重复发送syn ack,最多五次,等待时间从1s起每次翻倍,共63s。
SYN flood攻击防护: SYN队列满后,通过 tcp_syncookies 参数回发SYN Cookie,若为正常连接,则client回发SYN Cookie,直接建立连接。
根据 TCP 规范,当客户端发回 TCP ACK 包给服务器以响应服务器的 SYN + ACK 包时,客户端必须使用由服务器发送的初始序号加1作为数据包中的确认号。服务器接着从确认号中减去 1 以便还原向客户端发送的原始 SYN Cookie。
保活机制:向对方发送保活探测报文,未响应则继续发送,尝试次数达保活探测数仍未响应则中断。
2. TCP四次挥手
第一次挥手:Client发送一个FIN,用来关闭Client到Server的数据传送,Client进入FIN_WAIT_1状态(seq = u);
第二次挥手:Server收到FIN后,发送一个ACK给Client,确认序号为收到序号+1,Server进入CLOSE_WAIT状态(seq=v, ack=u+1);
第三次挥手:Server发送一个FIN,用来关闭Server到Client的数据传送,Server进入LAST_ACK状态(seq = w,不是v+1的原因是在这期间可能server还有要发往client的数据, ack=u+1);
第四次挥手:Client收到FIN后,Client进入TIME_WAIT状态,接着发送一个ACK给Server,确认序号为收到序号+1,Server进入CLOSED状态,完成四次挥手(seq=u+1,ack=w+1)。
为什么会有TIME_WAIT状态:
i. 确保有足够时间让对方收到ACK包,如果被动关闭方没有收到ACK,就会触发对端重发FIN包;
ii. 避免新旧连接混淆。
为什么需要四次挥手:因为全双工,发送方和接收方各需要两次 挥手,共四次
服务器出现大量CLOSE_WAIT状态的原因:
对方关闭socket连接,我方忙于读或写,没有及时关闭连接:代码释放资源不合理或线程配置不合理。
3. TCP和 UDP区别
TCP面向连接,UDP面向无连接;
TCP提供 可靠性保证,UDP不提供;
TCP保证有序,UDP不保证有序性;
TCP速度慢,UDP速度快;
TCP重量级,UDP轻量级,TCP头部20字节,UDP8字节。
RTT(Round Trip Time):发送一个数据包到收到对应的ACK花费的时间。
RTO(Retransmation timeout): 重传时间间隔,基于RTT计算。
TCP滑动窗口:
TCP使用滑动窗口做流量控制与乱序重排。
接收方滑动窗口 = 接收方最大缓存池 - 接收方已接受或预留出的空间
发送方滑动窗口 = 接收方滑动窗口 - 发送方已发送但还没有收到ACK报文的信息

假如序号32的包未接收到,33到51的包都接收到了,需要等到32接收到了,才会对这一段发送ACK,否则就是一直等待,窗口不会滑动,保证有序。

浙公网安备 33010602011771号