[学习笔记][计算机网络](一)TCP连接的建立与释放
1、OSI与TCP/IP
OSI七层模型 | TCP/IP概念层模型 |
应用层(FTP、Telnet) | 应用层(FTP、Telnet) |
表示层 | |
会话层 | |
传输层(TCP、UDP) | 传输层(TCP、UDP、UGP) |
网络层(IP) | 网络层(IP、ICMP、ARP) |
数据链路层(ARP) | 链路层 |
物理层 |
2、TCP连接的建立——三次握手
2.1、TCP简介
2.1.1、TCP(传输控制协议)
- 面向连接的、可靠的、基于字节流的传输层通信协议
- 将应用层的数据流分割成报文段并发送给目标节点的TCP层
- 数据包都有序号,对方收到则发送ACK确认,未收到则重传。
- 使用校检和检验数据在传输过程中是否有误。
2.1.2、TCP报文头
source port:端口号【ip层的ip唯一标识主机,tcp协议和端口号唯一标识进程;;;ip+tcp协议+端口号(套接字)】
seq:4字节,报文的开始序号
ack:4字节,期望收到对方下一个报文段的第一个数据字节的序号(A,301-200;;;B,501)
TCP flags:
- URG:紧急指针标志
- ACK:确认序号标志
- PSH:push标志
- RST:重置连接标志
- SYN:同步序号,用于建立连接过程
- FIN:finish连接,用于释放连接
2.2、TCP的三次握手
如上图所示,在TCP/IP协议中,TCP/IP协议提供可靠的连接服务,采用三次握手建立一个连接:
- 客户端发送SYN包给服务端,并进入SYN_SEND状态等待服务器确认;
- 服务器接收到SYN,确认客户SYN,并发送SYN+ACK包给客户端,服务器进入SYN_RECV状态;
- 客户端接收到SYN+ACK,发送ACK给服务器,发送完毕两者进入ESTABLISHED状态,建立连接;
2.3、首次握手的隐患——SYN超时
问题起因:在服务器发出SYN+ACK(第二次握手)后未收到ACK(第三次握手),服务器不断尝试重发,Linux默认等待63秒断开连接。
SYN Flood隐患:恶意程序对服务器发出SYN包便下线,让服务器不断尝试,耗费服务器的SYN队列,影响正常连接。
措施:客户端最后会通过tcp_tcp_syncookie参数回发SYN Cookie来标识是正常连接,服务器不管SYN队列是否满了,接收到SYN Cookie就会创建连接。
3、TCP连接的释放——四次挥手
3.1、TCP的四次挥手
如上图所示,为TCP连接释放的四次挥手:
- Client发送FIN给Server;
- Server收到FIN,回发ACK,并进入CLOSE_WAIT状态;
- Server再次发送FIN+ACK,结束CLOSE_WAIT状态;
- Client接收FIN+ACK,发送ACK,并进入时长为2MSL的TIME_WAIT状态;
3.2、两个状态、一个时间
3.2.1、服务器的CLOSE_WAIT状态
为什么会有CLOSE_WAIT:
- 确保有足够的时间让对方接收到ACK
- 避免新旧连接混淆
服务器出现大量CLOSE_WAIT的原因:对方关闭socket连接,我方忙于读或写,没有及时关闭连接。
3.2.2、客户端的TIME_WAIT状态
为了避免客户端的ACK(第四次挥手)没有被服务器成功接收。
3.2.3、MSL
MSL:最长报文段寿命,2MSL是因为一来一回。