TCP/IP协议、三次握手、四次挥手详解

发布时间 2023-10-15 14:24:23作者: 不积硅步,无以至千里

TCP/IP协议模型

(TCP协议)传输控制协议是一种面向连接的、可靠的、基于字节流的方式进行有序的无差错的数据传输通讯协议,它负责完成传输层所指定的功能,利用重发技术和拥塞控制机制,向应用程序提供可靠的通信连接,使它能够自动适应网上的各种变化。比如:数据报检测、流量控制、拥塞控制、数据排序、超时重发等
TCP/IP是一个协议族,包括TCP、IP、UDP、ICMP、RIP、SMTP、ARP、TFTP等诸多协议,这些协议一起称为TCP/IP协议

各层简单解释:

应用层:为应用程序提供服务,对应各种软件,包括的协议有访问网页的HTTP协议、传输文件的FTP协议、发送邮件的SMTP协议/POP3协议、域名解析的DNS协议
表示层:数据格式化、数据加密,它使得不同操作系统之间通信成为可能
会话层:管理主机之间的进程,建立、管理和维护进程之间的会话,还可利用在数据中插入校验点来实现数据同步
传输层:建立、管理和维护端到端的连接,包括的协议有传输控制协议TCP、用户数据报协议UTP
网络层:路由选择、流量控制、IP地址及形成IP包,包括协议有互联网协议IP、互联网分组交换协议IPX
数据链路层:提供介质访问及链路管理,成帧并保证帧的无误传输,MAC地址
物理层:生活中所看到的物理设备,比如网卡、显卡、各接口等

TCP报文中较为重要的字段:
序号(sequencenumber):用来标识从源端到目的端发送的字节流,发起方发送数据时对此进行标记,比如:一个报文段的序号为100,此报文段数据部分共有200字节,则下一个报文段序号为300
确认号(acknowledgement number):指明下一个期待收到的字节序号,只有ACK标志位为1时确认序号字段才有效,ack = seq+1

标志位:
① URG:紧急指针标志,为1时表示紧急指针有效
② ACK:确认序号标志,ACK=1 时表示有效。只有当 ACK=1 时,前面的确认号字段才有效,TCP连接建立后,ACK 必须为 1
③ PSH:表示接收方在收到该报文段后应尽快将该报文段交给应用程序
④ RST:当RST=1时说明 TCP 连接出现了错误(如主机崩溃),必须释放连接后再重新建立连接,或者用于拒绝非法的报文段和拒绝连接请求
⑤ SYN:发起新连接,当SYN=1,表示这是一个请求建立连接的报文段;当SYN=1,ACK=1时,表示对方同意建立连接,只有在前两次握手中 SYN 才为 1
⑥ FIN:用于释放连接,FIN=1表示数据已经发送完成,可以释放连接

TCP三次握手:

所谓三次握手即是TCP连接建立的过程,此连接必定由一方主动打开,另一方被动打开,下图为客户端主动发起连接的图解:

首先主动打开连接的客户端结束CLOSED状态,被动打开的服务器端也结束CLOSED状态,并进入LISTEN状态。随后开始“三次握手”:
 客户端向服务端发送一段TCP报文:
    标志位为SYN=1,表示“请求建立新连接”;序号为seq=x(x通常为1);随后客户端进入SYN-SENT状态
服务端接收到来自客户端的TCP报文之后,结束LISTEN状态,并返回一段TCP报文:
    标志位为SYN=1,ACK=1,表示“已收到请求并同意创建新连接”;序号为seq=y;确认号为ack=x+1,表示将来自客户端的报文序号seq值加1作为自己确认号ack的值;随后服务端进入SYN-RCVD状态
客户端收到服务端的同意连接TCP报文后,确认了双方间数据传输是正常的,结束SYN-SENT状态,并返回最后一段TCP报文:
    标志位为ACK=1,表示“已收到同意连接的信号”;序号为seq=x+1,表示将来自服务端的确认号ack值作为自己的序号值;确认号为ack=y+1,表示将来自服务端序号seq值加1作为自己的确认号ack的值;随后客户端进入ESTABLISHED状态
服务端收到来自客户端的确认连接TCP报文之后,也确认了双方间数据传输正常,结束SYN-RCVD状态,进入ESTABLISHED状态

在第三次握手时就可以携带数据了,因为能够发出第三次握手报文的客户端,肯定接收到来自服务端的第二次握手报文,而伪造IP的客户端是不会接收到第二次报文的,所以,能够发出第三次握手报文的就是合法的用户,服务端在接收到第三次握手的瞬间,状态就会切换为ESTABLISHED,里面携带的数据就可以按照正常流程走了

为何两次握手不可以呢?原因是为了防止服务端开启一些无用的连接增加服务器开销以及防止已失效的连接请求报文段突然又传送到了服务端而产生错误。“第三次握手”是客户端向服务端发送数据,目的是告诉服务器,客户端有没有收到服务器“第二次握手”时传过去的数据,若发送的是“收到了”的信号,服务端接收后就正常建立TCP连接,否则建立TCP连接失败,服务器关闭连接端口,由此减少服务器开销及防止接收到失效请求而导致错误

TCP四次挥手:

所谓四次挥手即是TCP连接断开的过程,下图为客户端主动发起断开连接的图解:


挥手之前主动释放连接的客户端结束ESTABLISHED状态,随后开始“四次挥手”:
客户端向服务端发送TCP报文:
标志位为FIN=1,表示“请求释放连接”,序列号为seq=u,随后客户端进入FIN-WAIT-1状态并停止向服务端发送数据
服务端收到从客户端发出的释放连接的TCP报文后结束ESTABLISHED状态,进入CLOSE-WAIT状态并返回一段TCP报文:
标志位为ACK=1,表示“收到释放请求”,序列号为seq=v,确认号ack=u+1,表示将来自客户端报文序号seq值加1作为自己的确认号ack的值,随后服务端进入CLOSE-WAIT状态
客户端收到服务端确认结果后,进入FIN-WAIT-2状态。服务端做好了释放连接准备后再次向客户端发出一段TCP报文:
标志位为FIN=1,ACK=1,表示“已准备好释放”,序号为seq=w,确认号ack=u+1,服务器进入LAST-ACK状态并停止向客户端发送数据
客户端收到回复后,结束FIN-WAIT-2状态,进入TIME-WAIT状态,并向服务端发送一段报文:
标志位为ACK=1,表示“已收到准备释放信号”,序列号为seq=u+1,确认号为ack=w+1,表示将来自服务端报文序号seq值加1作为自己的确认号ack的值,客户端进入TIME-WAIT状态,客户端经过2MSL后进入CLOSE状态;服务器收到确认后,立刻进入CLOSE状态
(MSL指的是Maximum Segment Lifetime:一段TCP报文在传输过程中的最大生命周期。2MSL即是服务端发出为FIN报文和客户端发出的ACK确认报文所能保持有效的最大时长)

TCP连接状态解释
CLOSED 关闭状态,表示当前主机没有正在运行的传输连接
LISTEN 监听状态,表示服务器正在等待新的传输连接进入
SYN-RCVD 表示主机已收到一个连接请求,但尚未确认
SYN-SENT 表示主机已经发出一个连接请求,等待对方确认
ESTABLISHED 传输连接建立,双方进入正常数据传输状态
FIN-WAIT-1 (主动关闭)主机已经发送关闭连接请求,等待对方确认
FIN-WAIT-2 (主动关闭)主机已收到对方关闭连接确认,等待对方发送关闭连接请求
TIMED WAIT 完成双向传输连接关闭,等待所有分组消失
CLOSING 双方同时尝试关闭传输连接,等待对方确认
CLOSE WAIT (被动关闭)收到对方发来的关闭连接请求,并已确认
LAST ACK

(被动关闭)等待最后一个关闭连接确认,并等待所有分组消失