3.TCP的三次握手和四次挥手

2024-05-15 07:04
文章标签 tcp 四次 握手 挥手 三次

本文主要是介绍3.TCP的三次握手和四次挥手,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

 一、前置知识

  TCP是一种面向连接的、可靠的、基于字节流的传输层通信协议。在传输数据前通信双方必须建立连接(所谓连接,是指客户端和服务端各自保存一份关于对方的信息,比如ip地址,端口号等)。TCP通过三次握手建立一个连接,通过四次挥手释放一个连接。

  在了解TCP连接前,先了解TCP报文的头部结构:

  TCP报文段的头部结构主要包含以下几个部分:
1.源端口和目的端口(Source port,Destination port):这两个字段用来标识发送端和接收端的端口号,占16位。
2.序列号(Sequence number):占32位,用来标识从TCP源端向目的端发送的字节流。当发起方发送数据时,会对这些数据进行标记,确保数据的有序性和完整性。(seq)
3.确认序号(Acknowledgement number):占32位,只有在ACK标志位为1时,这个字段才有效。它表示接收方已经成功接收到的数据的序列号(ack=seq+1)
4.标志位:占6位,包含URG、ACK、PSH、RST、SYN、FIN等标志。其中ACK表示确认序号有效,FIN表示释放一个连接,SYN表示发起一个新连接。


二、TCP的三次握手

  三次握手就是通过三次数据包的交换,来确认通信双方收发数据的能力。

  1. 一开始,客户端和服务端都处于CLOSE状态,服务端监听客户端的请求,进入LISTEN状态。
  2. 第一次握手(客户端发送连接请求):客户端会向服务端发送一个SYN包,里面包含了客户端的初始序列号。然后客户端进入SYN_SENT状态。
  3. 第二次握手(服务端确认收到了客户端的连接请求):回复客户端一个SYN+ACK包,里面包含确认信息(表示收到了客户端的SYN包)和服务端的初始序列号。然后服务端进入SYN_RCVD(received的缩写)状态。
  4. 第三次握手(客户端收到服务端的确认后,再次向服务端确认):再回复一个ACK包给服务端。然后客户端进入ESTABLISHED状态,当服务端接收到这个ACK包后,也进入ESTABLISHED状态。
  5. 这样客户端和服务端之间就建立了一个可靠的连接,可以开始传输数据。

三、TCP的四次挥手

  1. 数据传输结束后,通信双方都可以主动发起释放连接请求,假设由客户端发起。
  2. 第一次挥手(客户端发送释放连接请求):客户端向服务端发送一个FIN包,并附带一个序列号。然后,客户端进入FIN_WAIT1状态。
  3. 第二次挥手(服务端确认收到了客户端释放连接的请求):回复一个ACK包,同时包含一个确认号。然后,服务端进入CLOSE_WAIT状态(此时服务端还没准备好释放连接,可能还有数据要处理),当客户端收到服务端的这个ACK包后,进入FIN_WAIT2状态。
  4. 第三次挥手(服务端也已经准备好释放连接):向客户端发送一个FIN包,并附带一个序列号。然后,服务端进入LAST_ACK状态,表示等待来自客户端的最后一个ACK包。
  5. 第四次挥手(客户端确认服务端也已经准备好释放连接):就回复一个ACK包,但是此时客户端不会马上关闭连接,而是进入TIME_WAIT状态,等待某个固定时间(2MSL,2 Maximum Segment LifeTime,两倍的最长报文段生命周期),目的是防止这个ACK包丢失,导致服务端没有收到客户端关闭连接的确认,没有关闭连接,就会超时重传FIN包。那么等待这个固定时间后(即是确保服务端已经正常关闭连接后),客户端才关闭连接,进入CLOSED状态。当服务端收到这个ACK包后,就关闭连接,进入CLOSED状态。
  6. 这样就成功释放连接了。

这篇关于3.TCP的三次握手和四次挥手的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/991135

相关文章

TCP 可靠传输的工作原理

转载地址:https://my.oschina.net/xinxingegeya/blog/485233 感谢原作者 TCP 可靠传输的工作原理 ARQ(Automatic Repeat-reQuest)(自动重传请求) 停止等待ARQ协议 连续ARQ协议   停止等待ARQ协议 全双工通信的双发既是发送方也是接收方。下面为了讨论问题的方便,我们仅考虑A发送数据而B接受数据

ESP32使用MQTT_TCP连接阿里云

ESP32-IDF中MQTT函数的介绍 esp_mqtt_client_handle_t esp_mqtt_client_init(const esp_mqtt_client_config_t *config) 函数功能:mqtt 客户端初始化 函数形参: mqtt 客户端的配置 函数返回值:正确则返回根据配置创建的 mqtt 客户端句柄;异常则返回 NULL。 其中函数形参 esp_mqtt

【LinuxC语言】第一个简单的tcp/ip客户端

文章目录 前言一、客户端连接服务器的示意图二、客户端涉及的相关函数socket函数connect函数struct sockaddr结构体相关的转换函数connect主体函数 发送数据函数接收数据函数关闭socket客户端示例代码 总结 前言 在计算机网络中,TCP/IP 是最常见的网络协议。它为我们提供了一种可靠的方式来发送和接收数据。在这篇文章中,我们将使用 Linux C

TCP与UDP_三次握手_四次挥手

TCP vs UDP TCP数据 具体可以通过Cisco Packet Tracer工具查看: UDP数据 三次握手、四次挥手 为什么是3/4次?这牵扯到单工、双工通信的问题 TCP建立连接:表白 TCP释放连接:分手 TCP—建立连接—三次握手 解释: 首先,启动服务器,让服务器进入监听状态(监听客户端的连接请求)。客户端向服务器发送同

【linuxC语言】第一个简单的TCP/IP服务器

文章目录 前言一、服务器开发结构图二、深度解析服务器三、服务器开发相关函数htonl函数bind函数listen函数accept函数INADDR_ANY 宏struct sockaddr_in的不同场景区别tcp/ip服务器示例代码 总结 前言 在计算机网络中,TCP/IP 是一种非常重要的通信协议。它是互联网的基础,也是许多网络应用的核心。在 Linux 环境下,我们可以使

TCP、HTTP详解

TCP和HTTP   TCP(Transmission Control Protocol,传输控制协议)是一种面向连接的、可靠的、基于字节流的传输层通信协议,采用三次握手建立连接,四次挥手终止连接。   TCP连接一旦建立,在通信双方中的任何一方主动关闭连接之前,TCP 连接都将被一直保持下去,服务器和客户端均可主动发起断开连接的请求。   HTTP(Hypertext Transfer Pr

Netty解决TCP粘包/拆包导致的半包读写问题

一.TCP粘包/拆包问题说明   TCP是个“流”协议,就是没有界限的一串数据。TCP底层并不了解上层业务数据的具体含义,它会根据TCP缓冲区的实际情况进行包拆分,所以在业务上认为,一个完整的包可能会被TCP拆分成多个包进行发送,也有可能把多个小的包封装成一个大的数据包发送,这就是所谓的TCP粘包和拆包问题。 二.利用LinedBasedFrameDecoder解决TCP粘包问题    为了

iOS 网络相关面试题(TCP、三次握手、四次挥手、代码实现)

一、TCP的特点和报文结构 1、面向连接、可靠传输、面向字节流、全双工服务 2、TCP的报文结构 TCP报文段由首部字段和一个数据字段组成。 数据字段包含一块应用数据。最大报文长度MSS(Maximum Segment Size)限制了报文段数据字段的最大长度。MSS选项用于在TCP连接建立时,收发双方协商通信时每一个报文段所能承载的最大数据长度。 所以当TCP发送一个大文件(比如一张高清图

用户态协议栈06-TCP三次握手

最近由于准备软件工程师职称考试,然后考完之后不小心生病了,都没写过DPDK的博客了。今天开始在上次架构优化的基础上增加TCP的协议栈流程。 什么是TCP 百度百科:TCP即传输控制协议(Transmission Control Protocol)是一种面向连接的、可靠的、基于字节流的传输层通讯协议。 这里最需要关注的就是基于字节流,在我们使用Linux的Posix API创建TCP的Sock

面向连接的TCP和无连接的UDP

用户数据报协议UDP和传输控制协议TCP: 1.TCP传输的是TCP报文段,UDP传输的是UDP用户数据报。 2.UDP在传送数据之前不需要先建立连接。远地主机的运输层在收到UDP报文后,不需要给出任何确认。虽然UDP不提供可靠交付,但在某些情况下UDP却是一种最有效的工作方式。TCP则提供面向连接的服务。在传送数据之前必须先建立连接,数据传送结束后释放连接。TCP不提供广播或多播服务。由于T