内容提要
TCP连接通过三次握手建立。第一次握手,客户端发送SYN请求并初始化序列号;第二次握手,服务端回复SYN-ACK并确认;第三次握手,客户端发送ACK确认。此过程确保双方的发送和接收功能正常,避免无效连接,是实现可靠数据传输的关键步骤。
延伸解读
为什么是三次而不是两次?
文章通过反证法证明:若仅两次握手,服务端无法确认自己的发送功能和客户端的接收功能是否正常,且客户端的初始序列号(ISN)得不到确认。更关键的是,两次握手可能因延迟的旧SYN包导致服务端建立无效连接。三次握手则让客户端在收到服务端SYN-ACK后,能识别出过期请求并回复RST,从而避免资源浪费。
三次握手的本质:交换与确认初始序列号
文章强调,三次握手核心是双方相互发送并确认初始序列号(ISN)。只有一次握手,接收端没有发送ISN;只有两次握手,仅发送端的ISN被确认,接收端的ISN无法确认。通过三次交互,双方都能确认自己的发送和接收功能正常,以及对方的发送和接收功能正常,为可靠数据传输奠定基础。
应用数据何时能携带?
文章指出,第一次握手不能携带应用数据,因为连接未建立,且若缓存数据会放大SYN Flood攻击。第二次握手虽可携带但无实质意义。第三次握手可以携带,因为发送方已进入ESTABLISHED状态,接收方收到后也会进入该状态,连接即建立完成,此时数据可转交上层应用。
用Wireshark定位握手失败
文章给出两个过滤表达式:`(tcp.flags.reset == 1) && (tcp.Seq == 1)` 可过滤出被拒绝的握手(如端口未监听);`(tcp.flags.syn == 1) && (tcp.analysis.retransmission)` 可过滤出重传的握手请求(如丢包)。结合Follow TCP Stream可查看失败全过程,帮助快速诊断连接问题。
Q&A
TCP连接的三次握手具体步骤是什么?
第一次握手:客户端发送SYN请求并初始化序列号;第二次握手:服务端回复SYN-ACK并确认;第三次握手:客户端发送ACK确认,连接建立完成。
为什么TCP需要三次握手而不是一次或两次?
三次握手确保双方的发送和接收功能正常,避免无效连接,只有一次或两次握手无法确认双方的状态。
在TCP三次握手中,哪一次可以携带应用数据?
只有第三次握手可以携带应用数据,前两次握手不能。
如何使用Wireshark分析TCP三次握手?
在Wireshark中抓包,使用tcp过滤器查看三次握手的过程,观察SYN、SYN-ACK和ACK报文。
TCP连接失败的常见原因有哪些?
TCP连接失败可能由于被拒绝或丢包,Wireshark可以帮助定位失败原因。
TCP三次握手中,客户端和服务端的状态变化是怎样的?
客户端从SYN-SENT状态到ESTABLISHED,服务端从SYN-RECEIVED状态到ESTABLISHED。