首页 > 其他分享 >TCP通信(三次握手、四次挥手)

TCP通信(三次握手、四次挥手)

时间:2024-09-06 20:25:09浏览次数:11  
标签:握手 SYN TCP 发送 四次 服务器 客户端

三次握手与四次挥手

1.三次握手

第一次握手都由客户端发起

在TCP/IP协议中,TCP协议提供可靠的连接服务,采用三次握手建立一个连接。

服务器必须准备好接受外来的连接。这通过调用socket、 bind和listen函数来完成,称为被动打开(passive open)。

第一次握手:客户通过调用connect进行主动打开(active open)。这引起客户TCP发送一个SYN(表示同步)分节(SYN=J),它告诉服务器客户将在连接中发送到数据的初始序列号。并进入SYN_SEND状态,等待服务器的确认。

第二次握手:服务器必须确认客户的

SYN,同时自己也得发送一个SYN分节,它含有服务器将在同一连接中发送的数据的初始序列号。服务器以单个字节向客户发送SYN和对客户SYN的ACK(表示确认),此时服务器进入SYN_RECV状态。

第三次握手:客户收到服务器的SYN+ACK。向服务器发送确认分节,此分节发送完毕,客户服务器进入ESTABLISHED状态,完成三次握手。

1.SYN_SEND:客户端发送SYN报文后进入此状态,等待服务器的确认。

2.‌SYN_RECV‌:服务器收到SYN报文后进入此状态,等待客户端的确认。

3.‌ESTABLISHED‌:当客户端和服务器端都发送和接收了ACK报文后,连接进入此状态,表示连接已经建立,可以进行数据传输。

类比打电话的过程:

第一次握手:喂,能听见我说话吧?

第二次握手:能听见你说话,你能听见我说话不?

第三次握手:能听见

开始通话

客户端的初始序列号为J,而服务器的初始序列号为K。在ACK里的确认号为发送这个ACK的一端所期待的下一个序列号。因为SYN只占一个字节的序列号空间,所以每一个SYN的ACK中的确认号都是相应的初始序列号加1.类似地,每一个FIN(表示结束)的ACK中的确认号为FIN的序列号加1。

完成三次握手,客户端与服务器开始传送数据,在上述过程中还有一些重要概念。

未连接队列:在三次握手协议中,服务器维护一个未连接队列,该队列为每个客户端的SYN包(syn=j)开设一个条目,该条目表明服务器已收到SYN包,并向客户发出确认,正在等待客户端确认包。这些条目所标识的连接在服务器处于SYN_RECV状态,当服务器收到客户端确认包时,删除该条目,服务器进入ESTABLISHED状态。

第一次握手:客户端发送SYN握手包(seq:a),进入等待服务器应答的状态(SYN_SEND)

第二次握手:服务器在收到客户端发送的握手包之后,给客户端回复一个ACK,还有一个握手包SYN(seq:b ack:a+1),进入等待接收的状态(SYN_RECV)

第三次握手:客户端在收到服务器发送的握手包以及确认包之后,给服务器再回复一个确认包ACK(seq:c,ack:b+1)

发送一次数据都要有序列号,但是不一定有应答号,只有这一次的数据中有应答包的时候才会有应答号

TCP连接过程:三次握手

TCP的三次握手握手发生在哪两个函数之间:accept connect

为什么一定是三次握手,而不能是两次握手?

主要是为了防止已经失效的连接请求报文突然又传送到了服务器,从而导致不必要的错误和资源的浪费。两次握手只能保证单向连接是畅通的。因为TCP是一个双向传输协议,只有经过第三次握手,才能确保双向都可以接收到对方的发送的数据。

2.四次挥手

四次挥手既可以由客户端发起,也可以由服务器发起

TCP连接终止需四个分节。

类比挂电话的过程:

第一次挥手:我说完了,我要挂了

第二次挥手:好的,我知道了,但是你先别急,等我把话说完

第三次挥手:好了,我说完了,咱们可以挂电话了

第四次挥手:好的,挂了吧

第一次挥手:某个应用进程首先调用close,我们称这一端执行主动关闭。这一端的TCP于是发送一个FIN分节,表示数据发送完毕。

第二次挥手:接收到FIN的另一端执行被动关闭(passive close)。这个FIN由TCP确认。它的接收也作为文件结束符传递给接收端应用进程(放在已排队等候应用进程接收到任何其他数据之后)

第三次挥手:一段时间后,接收到文件结束符的应用进程将调用close关闭它的套接口。这导致它的TCP也发送一个FIN。

第四次挥手:接收到这个FIN的原发送端TCP对它进行确认。

标签:握手,SYN,TCP,发送,四次,服务器,客户端
From: https://blog.csdn.net/2301_77143270/article/details/141968337

相关文章

  • 网络编程(TCP+网络模型)
    【1】TCP初版服务器#include<stdio.h>#include<sys/types.h>/*SeeNOTES*/#include<sys/socket.h>#include<netinet/in.h>#include<netinet/ip.h>#include<unistd.h>#include<arpa/inet.h>#include<string.h>......
  • 网络编程day02(字节序、TCP编程)
    目录【1】字节序1》大小端转换2》端口转换  3》IP地址转换主机字节序转换为网络字节序(小端序->大端序)网络字节序转换为主机字节序(大端序->小端序) 【2】TCP编程1》流程2》函数接口1> socket2>bind3>listen4>accept 5>recv 6>connect7>send 3》代......
  • jdk8调用第三方接口出现握手失败(Received fatal alert: handshake_failure)
    3、记一次错误1、问题出现的场景​1、通过java代码调用第三方接口,出现这个ssl认证,握手失败。我的jdk版本是1.8_131版本出现的错误提示:javax.net.ssl.SSLHandshakeException:Receivedfatalalert:handshake_failure​ 2、我通过curl命令在服务器上调用是可以......
  • HTTP与TCP的关系是什么?HTTP 的端口有什么意义?
    一、HTTP与TCP的关系HTTP(超文本传输协议)是建立在TCP(传输控制协议)之上的应用层协议。1.依赖关系•HTTP依赖TCP提供的可靠数据传输服务。TCP确保数据在网络中准确、有序地传输,并且能够处理数据包丢失、重复和乱序等问题。如果没有TCP的可靠性保障,HTTP传输的数据......
  • java.lang.ClassNotFoundException: net.logstash.logback.appender.LogstashTcpSocke
    出现以下错误,是因为项目缺少依赖:atorg.springframework.boot.logging.logback.LogbackLoggingSystem.reportConfigurationErrorsIfNecessary(LogbackLoggingSystem.java:189)atorg.springframework.boot.logging.logback.LogbackLoggingSystem.loadConfiguration(Log......
  • 【python】socket 入门以及多线程tcp链接
    Socket入门及多线程tcp链接网络基础知识三要素Socket是套接字的意思,是网络编程的核心对象,通信两端都独有自己的Socket对象,数据在两个Socket之间通过字节流(TCP协议)或者数据报包(UDP协议)的形式进行传输.本文主要针对tcp流程进行讲解socket-tcp流程图1.创建......
  • 实现TCP收发信息和UDP收发信息
    1.TCP通信服务器端#include<myhead.h>#defineSERPORT6666#defineSERIP"192.168.0.136"#defineBACKLOG5intmain(intargc,constchar*argv[]){ intoldfd=socket(AF_INET,SOCK_STREAM,0); if(oldfd==-1) { perror("socket"); retu......
  • 网络编程(TCP通信)
    【1】认识网络网络:多设备通信【2】IP地址1.基本概念IP地址是Internet中主机的标识Internet中的主机要与别的机器通信必须具有一个IP地址IP地址为32位(IPv4)或者128位(IPv6)NAT:公网转私网、私网转公网IPV4表示形式:常用点分十进制形式,如202.38.64.10,最后都会转换为一个32位的......
  • 使用Python模拟TCP/IP协议栈
    1.代码如下importrandomclassApplicationLayer:defsend_data(self,data):print(f"ApplicationLayer:Sendingdata:{data}")returndatadefreceive_data(self,data):print(f"ApplicationLayer:Receiveddata......
  • Linux之tcpdump
    参数详解参数含义-i指定tcpdump监听的网络接口eth0bond0等等-c指定要监听的数据包数量,达到指定数量后自动停止抓包-w指定将监听到的数据包写入文件中保存-A指定将每个监听到的数据包以ACSII可见字符打印-n指定将每个监听到数据包中的域名转换成IP......