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

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

3天内不再提示

讲一讲的TCP三次握手和四次挥手

阿铭linux 来源:阿铭linux 作者:阿铭linux 2023-02-03 10:43 次阅读

前言

如果你学过网络基础知识,那么你一定对TCP三次握手不陌生。今天我想用通俗的话来给大家讲一讲TCP三次握手和四次挥手。毕竟,这个知识点在面试时被问到的概率很高!

TCP特点

① 面向连接

TCP是面向客户端和服务器端连接的通讯协议,使用它可以将客户端和服务器端进行连接。数据通信之前,必须要有一个连接通道建立。

② 可靠性

是指无论网络环境多差,TCP都可以保证信息一定能够传递到接收端。TCP之所以可以保证可靠性主要得益于两个方面,一个是“状态性”,另一个是“可控制性”。所谓状态性是指TCP会记录信息的发送状态,例如,哪些数据收到了、哪些数据没收到等状态信息都会被记录;可控制性是指TCP会根据状态情况控制自己的行为,比如当TCP意识到丢包了就会控制重发此包,这样就实现了TCP的可靠性。 总之,TCP可以很好地处理传输过程中数据包丢失的情况,它会重复发送包,这个特性很关键。

③ 传输单位为数据段

是指TCP在数据传输时,传送的每一个数据包里的数据只是一个数据段单元,并非完整数据,比如,要传送一个1MB的文件,整个文件会被切割成诸多数据段,然后再进行传输。 由于数据段大小受应用层传送给的报文大小和所途径网络中的MYU值大小决定,所以每次发送的TCP数据段大小是不固定的。在一个具体的网络中,有一个MSS(Maximum Segment Size,即最大数据段大小),最小的和数据段可能仅有21字节(其中20字节属于TCP数据段头部,数据部分仅1字节)。

④基于字节流

说到字节流,不得不提一下UDP的传输,UDP传输是基于报文的,简单点理解,UDP传输一个消息,需要将整个消息封装成一个数据包,然后进行传输。而TCP不一样,它会把整个消息切割成若干段,然后每一个段再被封装成数据包,逐一传输。总之,TCP不像UDP那样以一个个报文独立地进行传输,而是在不保留报文边界的情况下以字节流方式进行传输。

TCP三次握手过程

了解了TCP的特点后,再来看TCP三次握手就容易理解为何要三次,而不是两次啦。

980f5594-a2fa-11ed-bfe3-dac502259ad0.png

一开始客户端和服务端都是CLOSED状态,就好比他们两个彼此相互不认识,谁都不理谁。下面为了更好理解三次握手,我把客户端叫做小客,服务器叫做小服。

有一天小客需要小服帮忙,于是小客首先跟小服打招呼:你好小服,我需要你帮助,可以帮我吗?(客户端发送SYN=1,seq=x,这个x是一个随机数) 小服收到消息后,会回一个反馈给到小客:你好小客,我可以帮助你啊,那我要如何帮你呢?(服务端发送SYN=1,ACK=1,同时发送seq=y,ack=x+1,这里的ack为客户端发送的seq数值加1) 小客收到小服的反馈后,很高兴,于是又跟小服回了一句:谢谢你小服,我需要你帮我做......(客户端再次跟服务端发送ACK=1,seq=x+1,ack=y+1)。 小服再次收到小客的反馈后,小服就开始帮小服做事情了,从此成为了好基友!

做一个简单总结:

第一次握手:客户端发送 SYN 报文,并进入 SYN_SENT 状态,等待服务器的确认;

第二次握手:服务器收到 SYN 报文,需要给客户端发送 ACK 确认报文,同时服务器也要向客户端发送一个 SYN 报文,所以也就是向客户端发送 SYN + ACK 报文,此时服务器进入 SYN_RCVD 状态;

第三次握手:客户端收到 SYN + ACK 报文,向服务器发送确认包,客户端进入 ESTABLISHED 状态。待服务器收到客户端发送的 ACK 包也会进入 ESTABLISHED 状态,完成三次握手。

TCP四次挥手

当客户端和服务端通信完毕后,需要断开连接,释放资源。在正式断开连接之前,客户端和服务端会出现几个状态,先看四次挥手状态图:

982eec92-a2fa-11ed-bfe3-dac502259ad0.png

我们还拿刚才小客和小服来举例,小客的事情在小服的帮助下得到了圆满结束,小客对小服非常感激,这一天小客跟小服提出了感谢。

小客:你好小服,我的事情在你的帮助下终于完成了,感谢你的帮忙,后面暂时不需要你的帮助啦。(FIN=1 seq=u)

小服:收到,小客,不用客气啦。这阵我也太累了,是该休息一下啦,那我们就后会有期吧?(ACK=1 seq=v ack=u+1; FIN=1 seq=w ack=u+1)

小客:再次感谢,后会有期!(ACK=1 seq=u+1 ack=w+1)

之后小客和小服就没有再联系了。

再来做个总结吧:

客户端发送断开TCP连接请求的报文,其中报文中包含seq序列号,是由发送端随机生成的,并且还将报文中的FIN字段置为1,表示需要断开TCP连接。(FIN=1,seq=x,x由客户端随机生成);

服务端会回复客户端发送的TCP断开请求报文,其包含seq序列号,是由回复端随机生成的,而且会产生ACK字段,ACK字段数值是在客户端发过来的seq序列号基础上加1进行回复,以便客户端收到信息时,知晓自己的TCP断开请求已经得到验证。(FIN=1,ACK=x+1,seq=y,y由服务端随机生成);

服务端在回复完客户端的TCP断开请求后,不会马上进行TCP连接的断开,服务端会先确保断开前,所有传输到A的数据是否已经传输完毕,一旦确认传输数据完毕,就会将回复报文的FIN字段置1,并且产生随机seq序列号。(FIN=1,ACK=x+1,seq=z,z由服务端随机生成);

客户端收到服务端的TCP断开请求后,会回复服务端的断开请求,包含随机生成的seq字段和ACK字段,ACK字段会在服务端的TCP断开请求的seq基础上加1,从而完成服务端请求的验证回复。(FIN=1,ACK=z+1,seq=h,h为客户端随机生成)

TCP连接中的状态说明

TCP三次握手和四次挥手过程中,客户端和服务端出现了多个TCP连接状态,下面我来做一个列举。

LISTEN:服务端上起了服务就会监听一个端口(例如SSHD服务监听22端口),等待客户端来连接它。

SYN_SENT:客户端想要连接服务端,先打招呼,也就是三次握手时的第一次,它把请求发出去后,就变成了这个状态,表示等待服务端的确认。

SYN_RECEIVED:服务端接收到了客户端的请求,之后需要反馈给客户端确认信息,并且同时也要把自己的请求信息一起发给客户端,此时就会变成SYN_RECEIVED状态。

ESTABLISHED:经过三次握手后,客户端和服务端相继变成ESTABLISHED状态,表示双方建立了连接。只有双方都是该状态,才可以顺利传输数据。

FIN_WAIT_1:客户端和服务端传输完数据后,总有一方需要主动发起关闭连接,这个FIN_WAIT_1状态出现在主动关闭方。当它发起关闭连接的请求后,就会变成此状态。它需要等待对方的确认。

FIN_WAIT_2:主动关闭方收到被动关闭方的确认信息后,就会变成此状态。

CLOSE_WAIT:被动关闭方收到主动方的关闭请求后,会发出确认信息,确认信息发出后就出现了CLOSE_WAIT。

LAST_ACK:被动关闭方除了发送确认信息外,还需要发送关闭确认信息给对方,这个信息发送完毕后,就会成为LAST_ACK状态,此时被动关闭方只需要等待主动关闭方的一个回馈确认信息。

TIME_WAIT:主动关闭方将最后一次的确认信息发送给被动关闭方,就会处于TIME_WAIT状态,该状态只出现在主动关闭方,它只需等待一个时间就会彻底关闭,这个等待的时间为2*MSL(Maximum Segment Lifetime,报文最长存活时间)。因为它需要一个等待时间,所以在Linux系统里,这个状态是最常见、最多的状态。

CLOSING:几乎看不到的状态,表示正在关闭连接,这个是瞬时完成的。

CLOSED:彻底关闭连接的状态(这是为方便描述假想的状态,实际不存在)


审核编辑:刘清

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

    关注

    12

    文章

    8013

    浏览量

    82209
  • TCP
    TCP
    +关注

    关注

    8

    文章

    1253

    浏览量

    78192
  • ACK
    ACK
    +关注

    关注

    0

    文章

    27

    浏览量

    11073
  • UDP
    UDP
    +关注

    关注

    0

    文章

    310

    浏览量

    33567

原文标题:再谈TCP三次握手和四次挥手

文章出处:【微信号:aming_linux,微信公众号:阿铭linux】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    脉冲四次采样问题

    对单脉冲四次采样,第一次采样的时间是当脉冲到来时就采样,第二采样的时间是当第二脉冲到来时要延时个时钟周期,第
    发表于 10-08 15:46

    TCP恋爱史:三次握手四次分手

    ,心想:我他妈又没要链接,你返回这个是不是疯了。于是不置词。服务器过段时间还没有收到第三次握手的数据,知道客户端并没有要求建立链接的请求,含泪离开。然后是
    发表于 09-28 10:07

    这样TCP的恋爱和分手大家都懂了

    Client与Server之间可以开始传输数据了。▪ 四次挥手三次握手耳熟能详,四次挥手估计就{
    发表于 07-25 14:47

    分享个讲解TCP的,很好懂

    挥手三次握手耳熟能详,四次挥手估计就 ,所谓四次挥手
    发表于 07-25 20:04

    verilog实现三次样条插值

    本帖最后由 我来看看你在干什么 于 2018-5-15 09:10 编辑 用verilog实现EMD算法,需要用到三次样条插值法,请问有做过类似算法实现的吗,可以下verilog实现
    发表于 05-13 21:34

    三次握手四次挥手你懂吗

    程序员面试被问到“三次握手四次挥手”怎么办?
    发表于 04-08 07:23

    TCP/IP协议连接指南

    中扮演什么角色了。文章目录ESP32 单片机学习笔记 - 07 - TCP连接、例程实践1)建立TCP客户端 - tcp_client2)总结二、
    发表于 02-17 07:45

    简单一讲PCB Layout的设计要点

    如何进行合理的PCB布板设计呢?简单一讲PCB Layout的设计要点
    发表于 02-22 06:16

    TCP三次握手的过程描述

    本文档主要描述TCP三次握手的过程,一个完整的三次握手也就是 请求---应答---再次确认
    发表于 03-02 15:37 8次下载

    TCP三次握手过程及四次挥手过程说明

    三次握手 置位概念:根据 TCP 的包头字段,存在 3 个重要的标识 ACK、SYN、FIN ACK:表示验证字段 SYN:位数置 1,表示建立 TCP 连接 FIN:位数置 1,表示
    的头像 发表于 03-01 12:00 3887次阅读

    TCP三次握手四次挥手以及11种状态资料下载

    电子发烧友网为你提供TCP三次握手四次挥手以及11种状态资料下载的电子资料下载,更有其他相关的电路图、源代码、课件教程、中文资料、英文资料
    发表于 04-15 08:41 2次下载
    <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>以及11种状态资料下载

    TCP三次握手四次挥手过程中的异常情况

    TCP 三次握手四次挥手过程中,途中某一步的报文丢失了,会发生什么?
    的头像 发表于 09-05 10:23 922次阅读

    TCP建立连接概述及三次握手四次挥手的流程

    具备上述四个条件后A获取B的信息是有要求的,根本上的要求是数据信道可靠,就是平时所说的可靠连接,那么如何保证连接的可靠性呢,TCP协议就是靠确认应答机制、超时重传机制等保证连接可靠性的,接下来就通过TCP协议的三次
    的头像 发表于 03-23 15:57 715次阅读
    <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三次握手四次挥手

    前言今天的分享,是关于前两天读到的心得,TCP建立连接时三次握手,断开时为何4次握手的自我理解:恋爱时连接时客户端说:SYN(约吗?)服务器说:SYNACK(约啊,一起)接着客户端说:
    的头像 发表于 08-28 16:11 366次阅读
    用恋爱的方式解释<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三次握手的过程?为什么是三次而不是两次、四次

    说说TCP三次握手的过程?为什么是三次而不是两次、四次TCP
    的头像 发表于 02-04 11:03 185次阅读