【网络】TCP协议(第四篇)

目录

一、TCP概述

二、面向连接

三次握手

一、第一次握手

二、第二次握手

三、第三次握手

总结

三次握手为什么不能是两次?

四次挥手

四次挥手的过程如下:

为什么需要TIME_WAIT状态?


一、TCP概述

TCP(Transmission Control Protocol,传输控制协议)是一种面向连接的、可靠的、基于字节流的传输层通信协议。它由IETF的RFC 793定义,并广泛应用于互联网中。TCP的主要目的是在不可靠的网络环境中提供可靠的、有序的数据传输服务。

TCP的主要特点包括:

  1. 面向连接:TCP通信双方在进行数据传输之前,必须先通过三次握手(Three-way Handshake)建立连接。这种连接是全双工的,即双方都可以同时发送和接收数据。

  2. 可靠性:TCP通过一系列机制来确保数据传输的可靠性,包括校验和(用于检测数据是否损坏)、序列号(用于有序地重新排列乱序到达的数据包)、确认应答(ACK)机制(用于告知发送方数据已被接收)、超时重传(如果发送方在一定时间内未收到确认应答,则重新发送数据)、连接管理(包括建立连接、数据传输和终止连接)等。

  3. 流量控制:TCP通过滑动窗口协议来实现流量控制,以避免发送方发送数据过快而导致接收方来不及处理,从而引发拥塞。

  4. 拥塞控制:TCP还包含了一套拥塞控制算法,如慢开始、拥塞避免、快重传和快恢复等,以应对网络中的拥塞情况,确保网络的稳定性和效率。

  5. 面向字节流:TCP将上层应用层的数据视为无结构的字节流,不关心数据的具体含义和格式。它只负责将字节流从一端传输到另一端,而不进行任何分割或合并。

TCP的这些特点使得它非常适合用于需要高可靠性和大数据量传输的应用场景,如文件传输、电子邮件、网页浏览等。然而,由于TCP需要建立连接和进行复杂的可靠性保证,因此在某些对实时性要求较高或带宽有限的场合,可能会选择使用UDP(User Datagram Protocol,用户数据报协议)等其他传输层协议。

二、面向连接

三次握手

TCP的三次握手是建立TCP连接时的一个重要过程,它确保了通信双方能够正常交换信息,避免数据的丢失和混乱。以下是三次握手的详细细节:

一、第一次握手

  • 发起方(客户端):客户端向服务器发送一个SYN(同步)包,表示客户端希望建立连接。这个SYN包中,客户端会随机生成一个初始序列号(ISN,Initial Sequence Number),并将其放在序列号(seq)字段中。同时,SYN标志位被置为1。
  • 状态:客户端发送完SYN包后,进入SYN_SENT状态,等待服务器的确认。

二、第二次握手

  • 接收方(服务器):服务器收到客户端的SYN包后,会进行以下操作:
    • 确认客户端的SYN包(ACK=1,ack=客户端的序列号+1),表示服务器已经收到了客户端的SYN包。
    • 服务器自己也发送一个SYN包,表示服务器也愿意建立连接。这个SYN包中,服务器会随机生成一个自己的初始序列号,并将其放在序列号(seq)字段中。
    • 服务器将这两个操作合并为一个SYN/ACK包发送给客户端。
  • 状态:服务器发送完SYN/ACK包后,进入SYN_RCVD状态,等待客户端的确认。

三、第三次握手

  • 发起方(客户端):客户端收到服务器的SYN/ACK包后,会进行以下操作:
    • 检查SYN/ACK包中的确认号(ack)是否为客户端发送的序列号+1,以及SYN标志位是否为1,以确认服务器的SYN包是否有效。
    • 客户端将ACK标志位置为1,确认号(ack)设置为服务器发送的序列号+1,表示客户端已经收到了服务器的SYN/ACK包。
    • 客户端发送这个ACK包给服务器。
  • 状态:客户端和服务器都收到对方的确认后,都进入ESTABLISHED状态,表示TCP连接已经成功建立。

总结

TCP的三次握手过程可以总结为:

  1. 第一次握手:客户端发送SYN包到服务器,并进入SYN_SENT状态。
  2. 第二次握手:服务器收到SYN包后,回复SYN/ACK包给客户端,并进入SYN_RCVD状态。
  3. 第三次握手:客户端收到SYN/ACK包后,回复ACK包给服务器,双方进入ESTABLISHED状态,连接建立成功。

这个过程的主要作用是确保通信的双方都能够正常交换信息,避免数据的丢失和混乱。通过三次握手,双方能够确认彼此都处于可通信的状态,从而建立起可靠的连接。

三次握手为什么不能是两次?

TCP的三次握手设计为三次而不是两次,主要是出于确保连接可靠性和防止已失效的连接请求报文段突然又传送到服务端,从而产生错误而设计的。以下是为什么三次握手不能简化为两次的主要原因:

  1. 防止已失效的连接请求报文段突然传送到服务端
    • 在网络中,由于网络延迟或拥塞等原因,客户端发送的连接请求(SYN报文)可能会在网络中滞留一段时间后才到达服务端。如果采用两次握手,那么在这个SYN报文到达服务端后,服务端会立即返回一个确认(SYN-ACK报文)给客户端,并认为连接已经建立。然而,如果此时客户端由于某种原因(如崩溃或超时)并没有收到服务端的SYN-ACK报文,它可能会重新发送一个SYN报文。如果这个重发的SYN报文在网络中传输较快,比之前的SYN报文先到达服务端,那么服务端就会为这个“迟到”的SYN报文重新分配资源,建立连接,从而导致资源的浪费和可能的混乱。
    • 通过三次握手,服务端在接收到客户端的SYN报文后,会先发送一个SYN-ACK报文给客户端,并等待客户端的确认(ACK报文)。只有在收到客户端的ACK报文后,服务端才认为连接已经建立。这样,即使之前有一个“迟到”的SYN报文到达服务端,服务端也会因为无法收到对应的ACK报文(因为那个SYN报文是过时的,客户端不会再发送ACK)而拒绝建立连接。
  2. 确保双方的接收、发送能力都正常
    • 通过三次握手,客户端和服务端都能够确认对方的接收和发送能力是正常的。第一次握手(SYN)确保了客户端的发送能力和服务端的接收能力;第二次握手(SYN-ACK)确保了服务端的发送能力和客户端的接收能力;第三次握手(ACK)是对第二次握手的确认,确保了整个连接的可靠性。
  3. 防止历史连接的错误
    • 在网络上,IP地址可能会重用。如果之前有一个连接因为某种原因(如客户端崩溃)没有正常关闭,那么这个连接的状态信息(如序列号)可能会保留在内存中或网络中的某个地方。如果此时一个新的连接使用了相同的IP地址和端口号,并且尝试使用与之前连接相同的序列号,那么就可能会出现连接混乱的情况。通过三次握手,可以确保双方都能够正确地重置连接状态,避免历史连接的错误影响新的连接。

综上所述,三次握手是TCP协议中确保连接可靠性和防止错误的一种重要机制,不能简化为两次。

四次挥手

在计算机网络中,特别是在TCP(传输控制协议)连接中,"四次挥手"(Four-way Handshake)是TCP连接终止过程的一个标准步骤,用于确保双方都能可靠地关闭连接并释放资源。这个过程与TCP连接的建立过程(三次握手)相对应,但用于断开连接。

四次挥手的过程如下:

  1. 客户端发送FIN报文段
    • 客户端(假设为A)想要关闭连接时,会向服务器(假设为B)发送一个FIN报文段。这个报文段告诉服务器,A已经没有数据要发送了,但是A仍然可以接收来自B的数据。
    • 此时,A进入FIN_WAIT_1状态,等待B的确认。
  2. 服务器发送ACK报文段
    • 服务器B收到A的FIN报文段后,会发送一个ACK报文段给A,确认收到了A的FIN报文段。
    • 这个ACK报文段不包含应用层数据,只是TCP层面的确认。
    • 此时,A进入FIN_WAIT_2状态,继续等待B的FIN报文段;而B则进入CLOSE_WAIT状态,表示B已经收到了A的关闭请求,但B可能还有数据要发送给A。
  3. 服务器发送FIN报文段
    • 当服务器B也完成了数据的发送,并且想要关闭连接时,它会向A发送一个FIN报文段。
    • 这个FIN报文段告诉A,B也没有数据要发送了。
    • 此时,B进入LAST_ACK状态,等待A的确认。
  4. 客户端发送ACK报文段
    • 客户端A收到B的FIN报文段后,会发送一个ACK报文段给B,确认收到了B的FIN报文段。
    • 这个ACK报文段发送完毕后,A进入TIME_WAIT状态,等待足够长的时间(通常是2MSL,即两倍的最大报文段生存时间),以确保B收到了A的确认。
    • 经过TIME_WAIT状态后,A最终关闭连接,释放资源。
    • 而B在收到A的ACK报文段后,立即关闭连接,释放资源。

为什么需要TIME_WAIT状态?

TIME_WAIT状态的主要目的是确保TCP连接能够可靠地关闭。它允许足够的时间让网络中可能存在的、由于网络延迟等原因而迟到的FIN或ACK报文段被接收和处理。这样可以防止新的连接因为使用了旧的连接的资源(如端口号)而被错误地建立。

 

  • 9
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

爱编程的小猴

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值