Bootstrap

两张图说完 TCP的三次握手 四次挥手 以及TCP的11种状态 TCP包体 以及TCP协议常用端口号

目录

TCP协议简介

协议解释:

UDP协议

TCP协议

常用TCP协议端口号及应用程序

TCP的11种状态

TCP三次握手(3-Way Handshake)

简要说明

三次握手过程中的数据包:

三次握手过程的示意图:

三次握手详细过程

为什么TCP客户端最后还要发送一次确认呢?

--having--

TCP四次挥手(4-Way Handshake)

简单解释

四次挥手过程中的数据包:

四次挥手过程的示意图:

详细解释:

为什么客户端最后还要等待2MSL?

TCP总结概述

两个为什么

为什么建立连接是三次握手,关闭连接却是四次挥手呢

如果已经建立了连接,但是客户端突然出现故障了怎么办?

总结


TCP协议简介

  • TCP(Transmission Control Protocol,传输控制协议)是面向连接的、可靠的、基于字节流的传输层协议。
    • 它提供了可靠的端到端通信,能够保证数据完整性、顺序以及避免丢包等问题。
    • TCP使用的流量控制、拥塞控制和可靠的确认机制使其成为大多数网络通信的首选协议。

在传输数据之前,TCP连接需要通过三次握手建立连接,在传输数据结束后,通过四次挥手断开连接。


协议解释:

UDP协议

  • UDP,在传送数据前不需要先建立连接
  • 远程的主机在收到UDP报文后也不需要给出任何确认。
  • 虽然UDP不提供可靠交付,但是正是因为这样,省去和很多的开销,使得它的速度比较快,比如一些对实时性要求较高的服务,就常常使用的是UDP。
  • 对应的应用层的协议主要有DNS,TFTP,DHCP,SNMP,NFS等。

TCP协议

  • TCP,提供面向连接的服务

  • 在传送数据之前必须先建立连接,建立连接就是确保双方的网络是通畅的

  • 数据传送完成后要释放连接,而且每发送一个数据包都要收到确认信息才会发送另外一个数据包。

  • 因此TCP是一种可靠的的运输服务

  • 但是正因为这样,不可避免的增加了许多的开销

  • 所以速度相比UDP就慢一些,比如确认,流量控制等

  • 对应的应用层的协议主要有 SMTP,TELNET,HTTP,FTP等


常用TCP协议端口号及应用程序

  1. HTTP - 端口号 80
    用于Web浏览器与Web服务器之间的通信,传输网页内容。

  2. HTTPS - 端口号 443
    用于安全的HTTP通信(通过TLS/SSL加密)。广泛应用于银行、电子商务等需要数据保密的场合。

  3. FTP - 端口号 21
    文件传输协议,用于在计算机之间传输文件。

  4. FTPS - 端口号 990
    FTP的安全版本,通过SSL/TLS加密进行数据传输。

  5. SSH - 端口号 22
    安全的Shell协议,提供远程登录、远程执行命令以及数据传输的安全通道。

  6. Telnet - 端口号 23
    远程登录协议,允许用户通过网络登录到远程计算机。由于缺乏加密,现在通常不推荐使用。

  7. SMTP - 端口号 25
    简单邮件传输协议,用于电子邮件的发送。

  8. SMTPS - 端口号 465
    SMTP的安全版本,使用SSL/TLS加密传输电子邮件。

  9. POP3 - 端口号 110
    邮局协议版本3,用于从邮件服务器下载电子邮件到本地客户端。

  10. IMAP - 端口号 143
    网络邮件访问协议,允许客户端从邮件服务器读取邮件内容,并保持邮件副本在服务器上。

  11. IMAPS - 端口号 993
    IMAP的安全版本,使用SSL/TLS加密传输邮件数据。

  12. DNS - 端口号 53
    域名系统协议,负责将域名转换为IP地址(如www.example.com → 192.0.2.1)。

  13. MySQL - 端口号 3306
    用于MySQL数据库的通信,客户端与数据库服务器之间的连接。

  14. PostgreSQL - 端口号 5432
    用于PostgreSQL数据库的通信。

  15. RDP - 端口号 3389
    远程桌面协议,用于远程控制Windows计算机。

  16. SFTP - 端口号 22
    安全文件传输协议,通常与SSH协议一起使用。

  17. MSSQL - 端口号 1433
    用于Microsoft SQL Server的通信。

  18. LDAP - 端口号 389
    轻量目录访问协议,用于查询和修改目录服务中的信息。

  19. LDAPS - 端口号 636
    LDAP的安全版本,使用SSL/TLS加密传输。

  20. SNMP - 端口号 161
    简单网络管理协议,用于监控和管理网络设备。

  21. IRC - 端口号 6660-6669
    Internet Relay Chat协议,用于即时聊天服务。

  22. VNC - 端口号 5900
    虚拟网络计算协议,用于远程桌面控制。

  23. BGP - 端口号 179
    边界网关协议,用于自治系统之间交换路由信息。

  24. NTP - 端口号 123
    网络时间协议,用于同步计算机系统的时间。

  25. Kerberos - 端口号 88
    用于身份验证和授权服务,常用于企业环境中的单点登录(SSO)。

  26. TFTP - 端口号 69
    简单文件传输协议,通常用于网络设备的启动和配置文件的传输。


TCP的11种状态

TCP连接的生命周期通过不同的状态进行控制。

每个连接都会经历这些状态,以确保连接的建立、数据传输以及最终的关闭。

下面是TCP的11种状态及其含义:

  1. LISTEN: 服务器端在等待客户端请求的连接。处于此状态的服务器正在监听端口。

  2. SYN_SENT: 客户端发送SYN请求,等待服务器确认连接请求。这个状态通常在客户端发起连接时出现。

  3. SYN_RECV: 服务器接收到客户端的SYN请求并发送了SYN+ACK响应,等待客户端的确认。

  4. ESTABLISHED: 客户端与服务器建立了连接,双方可以开始数据传输。在这个状态下,数据已经可以正常传送。

  5. FIN_WAIT_1: 客户端或服务器发起连接的关闭请求,发送一个FIN报文,进入该状态,等待对方确认。

  6. FIN_WAIT_2: 在接收到对方的确认后,进入此状态,表示对方已经准备好关闭连接,等待对方发出关闭请求。

  7. CLOSE_WAIT: 另一方发起连接关闭请求并发送FIN报文,处于此状态的主机等待应用层关闭连接并发送FIN报文。

  8. CLOSING: 双方几乎同时发送了FIN报文,处于此状态的主机等待对方的确认。

  9. LAST_ACK: 此状态表明已经发送了关闭连接的请求(FIN),并且正在等待对方的最后确认。

  10. TIME_WAIT: 主机在接收到对方的确认后进入此状态,它需要保持一定的时间,以确保对方收到了关闭连接的报文。

  11. CLOSED: 连接完全关闭,处于此状态表示连接的生命周期已结束。


TCP三次握手(3-Way Handshake)

简要说明

三次握手是TCP协议建立连接的过程,用于确保客户端和服务器之间的通信通道正常,数据可以可靠地传输。具体过程如下:

  1. 客户端 -> 服务器(SYN): 客户端向服务器发送一个SYN包(同步序列号),请求建立连接。SYN包中包含一个初始的序列号(Seq = x)。

  2. 服务器 -> 客户端(SYN + ACK): 服务器收到客户端的SYN包后,回复一个SYN + ACK包,表示确认建立连接,并给出服务器端的初始序列号(Seq = y),同时确认客户端的SYN包(Ack = x+1)。

  3. 客户端 -> 服务器(ACK): 客户端收到服务器的SYN + ACK包后,发送一个ACK包,确认服务器的序列号(Ack = y+1),此时连接建立,数据传输可以开始。

三次握手过程中的数据包:

  • SYN包(同步包)

    • 标志位:SYN=1, ACK=0

    • 作用:发起连接请求,携带初始序列号(ISN)

    • 示例:Client → Server,序列号=1000

  • SYN-ACK包

    • 标志位:SYN=1, ACK=1

    • 作用:确认收到SYN,返回服务端初始序列号

    • 示例:Server → Client,确认号=1001,序列号=5000

  • ACK包

    • 标志位:ACK=1

    • 作用:确认连接建立完成

    • 示例:Client → Server,确认号=5001


三次握手过程的示意图

客户端                           服务器
   |                                |
   |--- SYN ---->                   |    // 客户端发送SYN请求
   |                                |
   |<-- SYN + ACK ----               |    // 服务器回应SYN+ACK
   |                                |
   |--- ACK ---->                   |    // 客户端发送确认ACK,连接建立
   |                                |

三次握手详细过程

  • TCP服务器进程先创建传输控制块TCB

    • 时刻准备接受客户进程的连接请求此时服务器就进入了LISTEN(监听)状态;

  • TCP客户进程也是先创建传输控制块TCB

    • 然后向服务器发出连接请求报文。

    • 这是报文首部中的同部位SYN=1,同时选择一个初始序列号 seq=x。

    • 此时,TCP客户端进程进入了 SYN-SENT(同步已发送状态)状态。

    • TCP规定,SYN报文段(SYN=1的报文段)不能携带数据,但需要消耗掉一个序号。

  • TCP服务器收到请求报文后,如果同意连接,则发出确认报文。

    • 确认报文中应该 ACK=1,SYN=1,确认号是ack=x+1。

    • 同时也要为自己初始化一个序列号 seq=y,此时,TCP服务器进程进入了SYN-RCVD(同步收到)状态。

    • 这个报文也不能携带数据,但是同样要消耗一个序号。

  • TCP客户进程收到确认后,还要向服务器给出确认。

    • 确认报文的ACK=1,ack=y+1,自己的序列号

    • seq=x+1,此时,TCP连接建立,客户端进入ESTABLISHED(已建立连接)状态。

    • TCP规定,ACK报文段可以携带数据,但是如果不携带数据则不消耗序号。

  • 当服务器收到客户端的确认后也进入ESTABLISHED状态

    • 此后双方就可以开始通信了。

为什么TCP客户端最后还要发送一次确认呢?

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

  • 如果使用的是两次握手建立连接。

    • 假设有这样一种场景,客户端发送了第一个请求连接并且没有丢失,只是因为在网络结点中滞留的时间太长了,由于TCP的客户端迟迟没有收到确认报文,以为服务器没有收到

    • 此时重新向服务器发送这条报文,此后客户端和服务器经过两次握手完成连接,传输数据,然后关闭连接。

    • 此时此前滞留的那一次请求连接,网络通畅了到达了服务器,这个报文本该是失效的,但是,两次握手的机制将会让客户端和服务器再次建立连接

    • 这将导致不必要的错误和资源的浪费。

  • 如果采用的是三次握手,就算是那一次失效的报文传送过来了。

    • 服务端接收到了那条失效报文并且回复了确认报文,

    • 但是客户端不会再次发出确认。

    • 由于服务器收不到确认,就知道客户端并没有请求连接。


TCP四次挥手(4-Way Handshake)

简单解释

四次挥手是TCP协议断开连接的过程,用于确保数据传输完毕,双方正确关闭连接。具体过程如下:

  1. 客户端 -> 服务器(FIN): 客户端发送一个FIN包,表示客户端没有数据要发送了,请求关闭连接。

  2. 服务器 -> 客户端(ACK): 服务器收到客户端的FIN包后,发送一个ACK包确认收到FIN,表示可以关闭连接,但是服务器仍然可以向客户端发送数据。

  3. 服务器 -> 客户端(FIN): 当服务器完成数据发送后,它会发送一个FIN包给客户端,表示服务器也没有数据要发送了。

  4. 客户端 -> 服务器(ACK): 客户端收到服务器的FIN包后,发送一个ACK包确认收到FIN,至此,连接关闭。

四次挥手过程中的数据包:

  1. 客户端 -> 服务器(FIN):

    • FIN标志位: 1
    • 序列号: 客户端的序列号
  2. 服务器 -> 客户端(ACK):

    • ACK标志位: 1
    • 确认号: 客户端的FIN序列号 + 1
    • 序列号: 服务器的序列号
  3. 服务器 -> 客户端(FIN):

    • FIN标志位: 1
    • 序列号: 服务器的序列号
  4. 客户端 -> 服务器(ACK):

    • ACK标志位: 1
    • 确认号: 服务器的FIN序列号 + 1
    • 序列号: 客户端的序列号

四次挥手过程的示意图

客户端                           服务器
   |                                |
   |--- FIN ---->                   |    // 客户端发送FIN请求
   |                                |
   |<-- ACK ----                    |    // 服务器确认收到FIN
   |                                |
   |<-- FIN ----                    |    // 服务器发送FIN,表示关闭连接
   |                                |
   |--- ACK ---->                   |    // 客户端确认收到服务器的FIN,连接关闭
   |                                |

详细解释:

  • 断开连接需要四次挥手,数据传输完毕后,双方都可释放连接。

    • 最开始的时候,客户端和服务器都是处于ESTABLISHED状态。

    • 然后客户端主动关闭,服务器被动关闭。服务端也可以主动关闭。

------------------------------

  • 客户端进程发出连接释放报文,并且停止发送数据。

    • 释放数据报文首部,FIN=1,其序列号为seq=u(等于前面已经传送过来的数据的最后一个字节的序号加1)。

    • 此时,客户端进入FIN-WAIT-1(终止等待1)状态。

    • TCP规定,FIN报文段即使不携带数据,也要消耗一个序号

  • 服务器收到连接释放报文,发出确认报文,ACK=1,ack=u+1,并且带上自己的序列号seq=v,此时,服务端就进入了CLOSE-WAIT(关闭等待)状态。

    • TCP服务器通知高层的应用进程,客户端向服务器的方向就释放了,这时候处于半关闭状态

    • 即客户端已经没有数据要发送了,但是服务器若发送数据,客户端依然要接受。

    • 这个状态还要持续一段时间,也就是整个CLOSE-WAIT状态持续的时间。

  • 客户端收到服务器的确认请求后,此时,客户端就进入FIN-WAIT-2(终止等待2)状态

    • 等待服务器发送连接释放报文

    • 在这之前还需要接受服务器发送的最后的数据

  • 服务器将最后的数据发送完毕后

    • 就向客户端发送连接释放报文,FIN=1,ack=u+1,由于在半关闭状态

    • 服务器很可能又发送了一些数据,假定此时的序列号为seq=w

    • 此时,服务器就进入了LAST-ACK(最后确认)状态,等待客户端的确认。

  • 客户端收到服务器的连接释放报文后,必须发出确认,ACK=1,ack=w+1,而自己的序列号是seq=u+1

    • 此时,客户端就进入了TIME-WAIT(时间等待)状态

    • 注意此时TCP连接还没有释放,必须经过2∗∗MSL(最长报文段寿命)的时间后

    • 当客户端撤销相应的TCB后,才进入CLOSED状态。

  • 服务器只要收到了客户端发出的确认,立即进入CLOSED状态。

    • 同样,撤销TCB后,就结束了这次的TCP连接。

    • 可以看到,服务器结束TCP连接的时间要比客户端早一些。


为什么客户端最后还要等待2MSL?

  • MSL(Maximum Segment Lifetime)

  • TCP允许不同的实现可以设置不同的MSL值。

  • 第一,保证客户端发送的最后一个ACK报文能够到达服务器,因为这个ACK报文可能丢失

    • 站在服务器的角度看来,我已经发送了FIN+ACK报文请求断开了

    • 客户端还没有给我回应,应该是我发送的请求断开报文它没有收到

    • 于是服务器又会重新发送一次,而客户端就能在这个2MSL时间段内收到这个重传的报文

    • 接着给出回应报文,并且会重启2MSL计时器。

  • 第二,防止类似与“三次握手”中提到了的“已经失效的连接请求报文段”出现在本连接中。

    • 客户端发送完最后一个确认报文后,在这个2MSL时间中,就可以使本连接持续的时间内所产生的所有报文段都从网络中消失。

    • 这样新的连接中不会出现旧连接的请求报文


TCP总结概述

  1. 面向连接:TCP是面向连接的协议,在数据传输之前需要先建立连接(三次握手),并在传输完成后关闭连接(四次挥手)。

  2. 可靠性保证:TCP通过序列号、确认应答(ACK)机制、重传机制等,保证数据能够正确、有序地到达目标。每个数据段都有一个唯一的序列号,接收方通过确认应答来确保数据的完整性。

  3. 流量控制:TCP使用滑动窗口机制进行流量控制。发送方根据接收方的缓冲区大小决定每次发送的数据量,避免接收方的缓冲区溢出。

  4. 拥塞控制:TCP使用多种算法来控制网络拥塞,如慢启动、拥塞避免、快速重传、快速恢复等。这些算法可以动态调整数据发送的速率,避免网络过载。

  5. 数据传输:TCP是基于字节流的协议,数据在发送和接收过程中不会保留边界,接收方会按照数据的顺序重组字节流,恢复出原始的数据。


两个为什么

为什么建立连接是三次握手,关闭连接却是四次挥手呢

  • 1、建立连接的时候, 服务器在LISTEN状态下,收到建立连接请求的SYN报文后

    • 把ACK和SYN放在一个报文里发送给客户端。

  • 2、而关闭连接时,服务器收到对方的FIN报文时,仅仅表示对方不再发送数据了但是还能接收数据,而自己也未必全部数据都发送给对方了

    • 所以己方可以立即关闭,也可以发送一些数据给对方后,

    • 再发送FIN报文给对方来表示同意现在关闭连接

    • 因此,己方ACK和FIN一般都会分开发送,从而导致多了一次。

如果已经建立了连接,但是客户端突然出现故障了怎么办?

  • TCP还设有一个保活计时器,显然,客户端如果出现故障,服务器不能一直等下去,白白浪费资源。

    • 服务器每收到一次客户端的请求后都会重新复位这个计时器,时间通常是设置为2小时

    • 若两小时还没有收到客户端的任何数据,服务器就会发送一个探测报文段以后每隔75分钟发送一若一连发送10个探测报文仍然没反应,服务器就认为客户端出了故障接着就关闭连接。

    • 看图,x和y是随机序列号,不是固定的值,所以我用x和y表示了


总结

  • 三次握手用于建立可靠的连接,确保双方可以通信。
  • 四次挥手用于平稳关闭连接,确保所有数据都已传送完毕并且双方都同意断开连接。
  • TCP协议通过一系列机制(如序列号、确认应答、流量控制、拥塞控制等)来确保数据的可靠传输。

通过三次握手和四次挥手,TCP能够保证端到端通信的可靠性和有效性,并且可以灵活处理各种网络状况。


喜欢本文的请动动小手点个赞,收藏一下,有问题请下方评论,转载请注明出处,并附有原文链接,谢谢!如有侵权,请及时联系。

;