计算机网络学习笔记(一)

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,否则就是一直等待,窗口不会滑动,保证有序。

 

posted @ 2021-12-08 13:44  h01d  阅读(34)  评论(0)    收藏  举报