[学习笔记][计算机网络](一)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(传输控制协议)

  1. 面向连接的、可靠的、基于字节流的传输层通信协议
  2. 将应用层的数据流分割成报文段并发送给目标节点的TCP层
  3. 数据包都有序号,对方收到则发送ACK确认,未收到则重传。
  4. 使用校检和检验数据在传输过程中是否有误。

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协议提供可靠的连接服务,采用三次握手建立一个连接:

  1. 客户端发送SYN包给服务端,并进入SYN_SEND状态等待服务器确认;
  2. 服务器接收到SYN,确认客户SYN,并发送SYN+ACK包给客户端,服务器进入SYN_RECV状态;
  3. 客户端接收到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连接释放的四次挥手:

  1. Client发送FIN给Server;
  2. Server收到FIN,回发ACK,并进入CLOSE_WAIT状态;
  3. Server再次发送FIN+ACK,结束CLOSE_WAIT状态;
  4. Client接收FIN+ACK,发送ACK,并进入时长为2MSLTIME_WAIT状态;

3.2、两个状态、一个时间

3.2.1、服务器的CLOSE_WAIT状态

为什么会有CLOSE_WAIT:

  1. 确保有足够的时间让对方接收到ACK
  2. 避免新旧连接混淆

服务器出现大量CLOSE_WAIT的原因:对方关闭socket连接,我方忙于读或写,没有及时关闭连接。

3.2.2、客户端的TIME_WAIT状态

为了避免客户端的ACK(第四次挥手)没有被服务器成功接收。

3.2.3、MSL

MSL:最长报文段寿命,2MSL是因为一来一回。