0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

TCP三次握手与四次挥手的细节理解

GReq_mcu168 来源:码农爱学习 作者:码农爱学习 2021-03-25 14:11 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

简介

TCP提供面向有连接的通信传输,面向有连接是指在数据通信开始之前先做好通信两端之间的准备工作。

TCP在数据通信之前,通过TCP首部发送一个SYN包作为建立连接的请求等待确认应答(TCP中发送第一个SYN包的一方叫做客户端,接收这个的一方叫做服务端)。如果对端发来确认应答,则认为可以进行数据通信。如果对端的确认应答未能到达,就不会进行数据通信。此外,在通信结束时会进行断开连接的处理(FIN包)。

一个连接的建立与断开,正常过程至少需要来回发送7个包才能完成(建立一个TCP连接需要发送3个包,这个过程也称作“三次握手”,断开一个TCP连接需要发送4个包,这个过程也称作“四次挥手”)。

af0d6c02-8cec-11eb-8b86-12bb97331649.png

TCP报文段首部

在具体理解三次握手与四次挥手的细节时,需要先了解一下TCP报文段的首部格式:

af854cd6-8cec-11eb-8b86-12bb97331649.jpg

主要需要了解的是:

序号 seq

占4个字节,范围[0,223-1],共223(42 9496 7296)个序号。TCP是面向字节流的,在一个TCP连接中传送的字节流中的每一个字节都按顺序编号。

确认号 ack

占4个字节,是期望收到对方下一个报文段的第一个数据字节的序号。

确认 ACK

仅当ACK=1时确认号字段才有效,当ACK=0时,确认号无效。TCP规定,在建立连接后所传送的报文都必须把ACK置1。

同步 SYN

在连接时用来同步序号,当SYN=1而ACK=0时,表明这是一个连接请求报文段,对方若同意连接,在应在响应的报文段中使用SYN=1和ACK=1。因此,SYN置为1就表示这是一个连接请求或连接接受报文。

终止 FIN

用来释放一个连接,当FIN=1时,表明此报文段的发送方的数据已发送完毕,并要求释放运输连接。

三次握手

afdd4238-8cec-11eb-8b86-12bb97331649.jpg

最初两端的TCP进程都处于CLOSE(关闭)状态。上图中A主动打开连接,B被动打开连接。

B打开连接后处于LISTEN(监听状态),等待客户的连接请求。

A向B发送请求报文,SYN=1,ACK=0,选择一个初始序号seq=x。

B 收到连接请求报文,如果同意建立连接,则向 A 发送连接确认报文,SYN=1,ACK=1,确认号为ack= x+1,同时也选择一个初始的序号 seq=y。

A 收到 B 的连接确认报文后,还要向 B 发出确认,确认号为ack= y+1,序号为 seq=x+1。

B 收到 A 的确认后,连接建立。

必须握手三次而不是两次的原因

主要是防止已经失效的连接请求报文突然又传送到了服务器,从而产生错误

如果使用的是两次握手建立连接,假设有这样一种场景,客户端发送了第一个请求连接并且没有丢失,只是因为在网络结点中滞留的时间太长了,由于TCP的客户端迟迟没有收到确认报文,以为服务器没有收到,此时重新向服务器发送这条报文,此后客户端和服务器经过两次握手完成连接,传输数据,然后关闭连接。此时此前滞留的那一次请求连接,网络通畅了到达了服务器,这个报文本该是失效的,但是,两次握手的机制将会让客户端和服务器再次建立连接,这将导致不必要的错误和资源的浪费。

如果采用的是三次握手,就算是那一次失效的报文传送过来了,服务端接受到了那条失效报文并且回复了确认报文,但是客户端不会再次发出确认。由于服务器收不到确认,就知道客户端并没有请求连接。

建立连接后,客户端出现故障时的机制

TCP设有一个保活计时器,显然,客户端如果出现故障,服务器不能一直等下去,白白浪费资源。服务器每收到一次客户端的请求后都会重新复位这个计时器,时间通常是设置为2小时,若2小时还没有收到客户端的任何数据,服务器就会发送一个探测报文段,以后每隔75秒发送一次。若一连发送10个探测报文仍然没反应,服务器就认为客户端出了故障,接着就关闭连接。

四次挥手

b055125e-8cec-11eb-8b86-12bb97331649.jpg

A 发送连接释放报文,FIN=1。

B 收到之后发出确认,此时 TCP 属于半关闭状态,B 能向 A 发送数据但是 A 不能向 B 发送数据。

当 B 不再需要连接时,发送连接释放报文,FIN=1。

A 收到后发出确认,进入 TIME-WAIT 状态,等待 2 MSL(最大报文存活时间)后释放连接。

B 收到 A 的确认后释放连接。

四次挥手的细节

CLOSE-WAIT

客户端发送了 FIN 连接释放报文之后,服务器收到了这个报文,就进入了 CLOSE-WAIT 状态。这个状态是为了让服务器端发送还未传送完毕的数据,传送完毕之后,服务器会发送 FIN 连接释放报文。

TIME-WAIT

客户端接收到服务器端的 FIN 报文后进入此状态,此时并不是直接进入 CLOSED 状态,还需要等待一个时间计时器设置的时间 2MSL。原因有二:

为保证A发送的最后一个ACK报文段能够到达B

A发送的这个ACK报文段有可能丢失,如果 B 没收到 A 发送来的确认报文,那么A就会重新发送连接释放请求报文,A 等待一段时间就是为了处理这种情况的发生。

防止“已经失效的连接请求报文段”出现在本链接中

A在发送完最后一个ACK报文段后,再经过时间2MSL,就可以使本连接的时间内所产生的所有报文段都从网络中消失。这样下一个新的连接中就不会出现这种旧的连接请求报文段。

为何建立连接协议是三次握手,而关闭连接却是四次挥手?

因为服务端B的LISTEN状态下的SOCKET当收到SYN报文的连接请求后,它可以把ACK和SYN(ACK起应答作用,而SYN起同步作用)放在一个报文里来发送。但关闭连接时,当B收到对方A的FIN报文通知时,它仅表示客户端A没有数据发送给B了;但未必B的数据都全部发送给A了,所以B可能未必会马上会关闭SOCKET,而是先发送一个ACK应答信号,继续将剩余的数据发送给A之后,再发送FIN报文给A表示B同意现在可以关闭连接了,所以它这里的ACK报文和FIN报文多数情况下都是分开发送的。

原文标题:TCP的三次握手与四次挥手

文章出处:【微信公众号:玩转单片机】欢迎添加关注!文章转载请注明出处。

责任编辑:haq

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 通信
    +关注

    关注

    18

    文章

    6318

    浏览量

    139570
  • TCP
    TCP
    +关注

    关注

    8

    文章

    1418

    浏览量

    83021

原文标题:TCP的三次握手与四次挥手

文章出处:【微信号:mcu168,微信公众号:硬件攻城狮】欢迎添加关注!文章转载请注明出处。

收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    TCP三次握手

    ,Server进入SYN_RCVD状态。 (3)第三次握手:Client收到确认后,检查ack是否为J+1,ACK是否为1,如果正确则将标志位ACK置为1,ack=K+1,并将该数据包发送给Server
    发表于 12-02 07:16

    TCP三次握手四次挥手,这样解释太通俗易懂了!

    TCP连接的建立和释放分别通过“三次握手”和“四次挥手”来完成。三次
    的头像 发表于 04-24 19:33 1283次阅读
    <b class='flag-5'>TCP</b><b class='flag-5'>三次</b><b class='flag-5'>握手</b>和<b class='flag-5'>四次</b><b class='flag-5'>挥手</b>,这样解释太通俗易懂了!

    一文看懂TCP三次握手工作原理

    1.TCP 为什么三次握手而不是两握手 1.防止已失效的连接请求又传送到服务器端,因而产生错误。 不幸的是, 这种解释是不准确的, 
    的头像 发表于 01-09 10:19 1798次阅读
    一文看懂<b class='flag-5'>TCP</b><b class='flag-5'>三次</b><b class='flag-5'>握手</b>工作原理

    如何监测TCP三次握手过程

    在计算机网络中,传输控制协议(TCP)是确保数据可靠传输的关键协议之一。TCP通过三次握手过程来建立两个端点之间的连接,这个过程对于网络通信的稳定性和安全性至关重要。
    的头像 发表于 01-06 09:20 1290次阅读

    TCP三次握手与负载均衡的配置

    在计算机网络中,TCP(传输控制协议)是一种面向连接的、可靠的、基于字节流的传输层通信协议。它通过三次握手(Three-way Handshake)建立连接,确保数据的可靠传输。而负载均衡(Load
    的头像 发表于 01-06 09:15 908次阅读

    TCP三次握手如何影响网络性能

    在计算机网络中,TCP是一种面向连接的、可靠的、基于字节流的传输层通信协议。它通过三次握手过程来建立两个网络实体之间的连接,确保数据传输的可靠性和顺序性。 TCP
    的头像 发表于 01-06 09:13 1067次阅读

    TCP三次握手的常见问题及解决方案

    TCP三次握手(Three-way Handshake)是TCP(传输控制协议)建立连接时的一个过程,它确保了两个端点在开始通信之前都准备好了。这个过程包括
    的头像 发表于 01-06 09:11 1844次阅读

    TCP三次握手与连接建立的关系

    在计算机网络中,TCP(传输控制协议)是一种面向连接的、可靠的、基于字节流的传输层通信协议。它负责在两个主机之间建立、维护和终止连接,确保数据的可靠传输。TCP连接的建立过程是通过三次握手
    的头像 发表于 01-06 09:09 1168次阅读

    TCP三次握手的步骤详解

    1.TCP是一种面向连接的、可靠的、基于字节流的传输层通信协议。在两个主机之间建立通信之前,必须通过三次握手过程来建立一个稳定的连接。这个过程确保了两个端点都准备好发送和接收数据。 2. 第一
    的头像 发表于 01-06 09:07 1571次阅读

    TCP三次握手的网络抓包分析

    在计算机网络中,TCP(传输控制协议)是一种面向连接的、可靠的、基于字节流的传输层通信协议。TCP通过三次握手过程建立两个通信实体之间的连接,确保数据传输的可靠性和顺序性。
    的头像 发表于 01-06 09:05 1136次阅读

    TCP三次握手安全性分析

    TCP(传输控制协议)的三次握手是建立可靠连接的重要机制,它确保了通信双方在数据传输前的连接状态是可靠和准确的。然而,从安全性的角度来分析,TCP
    的头像 发表于 01-03 18:10 1559次阅读

    TCP三次握手与UDP的区别

    、连接管理、可靠性、效率等方面有着显著的区别。 1. TCP三次握手 TCP是一种面向连接的、可靠的、基于字节流的传输层通信协议。在数据传输之前,T
    的头像 发表于 01-03 17:35 1219次阅读

    TCP三次握手的基本原理

    在计算机网络中,TCP(传输控制协议)是一种面向连接的、可靠的、基于字节流的传输层通信协议。它确保了数据在网络中传输的可靠性和顺序性。为了建立两个网络实体之间的通信,TCP使用一种称为“三次
    的头像 发表于 01-03 17:25 1600次阅读

    TCP三次握手协议的作用

    在计算机网络中,数据的传输需要在发送方和接收方之间建立一个稳定的连接,以确保数据的完整性和顺序。TCP(传输控制协议)是一种面向连接的、可靠的、基于字节流的传输层通信协议,它通过三次握手协议来建立
    的头像 发表于 01-03 17:15 1438次阅读

    TCP三次握手的详细过程

    TCP(传输控制协议)三次握手是一种在互联网上建立一个可靠的、有序的和错误检测能力的连接的方法。这个过程确保了两个设备(通常是客户端和服务器)在数据传输开始之前能够相互确认对方的存在和状态。以下
    的头像 发表于 01-03 17:11 1828次阅读