首页 > 编程语言 >网络编程(三次握手四次挥手)

网络编程(三次握手四次挥手)

时间:2024-09-08 09:22:58浏览次数:6  
标签:服务器端 ACK 报文 编程 SYN TCP 四次 握手 客户端

【1】三次握手四次挥手

1》三次握手

第一次握手都又客户端发起,在TCP/IP协议中,TCP协议提供可靠的连接服务,采用三次握手建立一个连接。服务器必须准备好接收外来的链接,这通过调用socket、bind和listen函数来完成,称为被动打开。

第一次握手:客户通过调用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报文后,链接进入此状态,表示链接已建立,可以进行数据传输。

举个比较形象的例子:

打电话

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

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

第三次握手:能听见

开始通话

 三次握手详细过程说明:

第一次握手:客户端向服务器发送一个用于建立TCP链接的请求报文,该报文中包含seq_c序列号,是由客户端随机生成的,并且将报文中的SYN字段置1,表示要建立TCP链接。(SYN=1,seq_c=200,200是客户端随机生成的)。

第二次握手:服务器对客户端发送过来的TCP请求报文做出回应,也发送一个TCP报文,该报文中包含seq_s序列号,由服务器端随机生成,并将报文中的SYN字段置1,表示建立连接,而且还会包含ACK字段,ACK置1表示却热建立连接,同时还会有一个ack_s确认序号,ack_s的值是客户端发送过来的序列号seq_c的基础上加1,用于告知客户端它的TCP请求报文已得到验证。(seq_s=500,ack_s=201,SYN=1,ACK=1,500是服务器端随机生成的)

第三次握手:客户端收到服务器端发送的TCP链接建立请求后,会再次发送一个TCP报文回复服务器,包含序列号seq_c和确认号ack_c,其中序列号是在自己上一次发的报文的序列号的基础上加1,确认号是在服务器发过来的序列号seq_s的基础上加1,同时还有ACK确认字段置1,用于告知确认链接。(seq_c=201,ack_c=501,ACK=1)

面试练习题:

TCP连接过程:

三次握手

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

accept、connect

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

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

 2》四次挥手

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


第一次挥手:客户端发送一个FIN,用来关闭客户端到服务器的数据传送,客户端进入FIN_WAIT-1状态

第二次挥手:服务器端收到FIN后,发送一个ACK给客户端,告诉客户端我已经收到你发过来的FIN报文,但此时可能还未传完数据,服务器端进入CLOSE_WAIT状态,;客户端收到该报文后会进入FIN_WAIT-2状态

第三次挥手:服务器端传送完数据了,向客户端发送一个FIN报文,用来关闭服务器端到客户端的数据传送,服务器进入LAST_ACK状态

第四次挥手:客户端收到FIN后,向服务器端发送一个ACK报文,告知服务器端我已收到你的FIN结束报文,客户端进入等待2MSL后进入CLOSED状态,服务器端在收到客户端发过俩的确认报文或也会进入CLOSED状态,连接断开。

举个比较形象的例子:

打电话

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

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

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

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

四次挥手过程详细说明: 

 

第一次挥手:客户端发送断开TCP链接请求的报文,包含seq序列号,是由客户端随机生成的,并且还将报文中的FIN字段置1,表示需要断开TCP链接,进入FIN_WAIT-1状态。(FIN=1,seq=u,u是由客户端随机生成的)

第二次挥手:服务器会回复客户端发送FIN报文,向客户端发送一个ACK确认报文,其中包含ACK标志位,置1,seq序列号,由服务器端随机生成,,ack确认号在客户端的seq序列号的基础上加1,该报文用于告知客户端我已收到你想要断开的请求,发送完进入CLOSE_WAIT状态,等客户端接收到该报文时,客户端会进入FIN_WAIT-2状态。(ACK=1,ack= u+1,seq=v, v是由服务器端随机生成的)


第三次挥手:服务器端在回复完客户端的TCP断开请求后,并不会立即断开TCP链接,而是会继续传送数据,直到自己的数据全部传输完后,会向客户端发送一个FIN报文,FIN标志位置1,表示要断开链接,ACK标志位置1,表示确认,seq序列号随机生成,ack确认号仍然是之前客户端seq的基础上加1,发送完进入LAST_ACK状态。(FIN=1,ACK=1,ack=u+1,seq=w,w是服务器端随机生成的)


第四次挥手:客户端收到服务器端的TCP断开请求后,会回复一个ACK确认报文,包含ACK标志位,置1,seq序列号,客户端随机生成的,ack确认号的值是在上一次服务器端的seq序列号的基础上加1,发送完之后,会进入TIME_WAIT状态,客户端需要等待2MSL的时间之后,才能进入CLOSED状态,服务器端在收到ACK报文后也会进入CLOSED状态。TCP链接断开。(ACK=1,ack=w+1,seq=u+1)

 3》各种状态解释

LISTEN:等待从任何远端TCP 和端口的连接请求。
 
SYN_SENT:发送完一个连接请求后等待一个匹配的连接请求。
 
SYN_RECEIVED:发送连接请求并且接收到匹配的连接请求以后等待连接请求确认。
 
ESTABLISHED:表示一个打开的连接,接收到的数据可以被投递给用户。连接的数据传输阶段的正常状态。
 
FIN_WAIT_1:等待远端TCP 的连接终止请求,或者等待之前发送的连接终止请求的确认。
 
FIN_WAIT_2:等待远端TCP 的连接终止请求。
 
CLOSE_WAIT:等待本地用户的连接终止请求。
 
CLOSING:等待远端TCP 的连接终止请求确认。
 
LAST_ACK:等待先前发送给远端TCP 的连接终止请求的确认(包括它字节的连接终止请求的确认)
 
TIME_WAIT:等待足够的时间过去以确保远端TCP 接收到它的连接终止请求的确认。
TIME_WAIT 两个存在的理由:
          1.可靠的实现tcp全双工连接的终止;
          2.允许老的重复分节在网络中消逝。
 
CLOSED:不在连接状态(这是为方便描述假想的状态,实际不存在)


今天的分享就到这里结束啦,如果有哪里写的不好的地方,请指正。
如果觉得不错并且对你有帮助的话点个关注支持一下吧!

标签:服务器端,ACK,报文,编程,SYN,TCP,四次,握手,客户端
From: https://blog.csdn.net/dghbs/article/details/141982081

相关文章

  • 【AIGC】AI编程工具合集及其特点介绍
    ......
  • C++编程-搜索与回溯算法2
    目录每日一诗先言正文例题六题目描述算法分析标准程序例题七:选书题目描述算法分析标准程序输出例题八:跳马问题题目描述标准程序小练习题目描述输入输出样例输入 复制样例输出 复制每日一诗红豆生南国,春来发几枝。愿君多采撷,此物最相思。Redbea......
  • Java 入门指南:Java 并发编程 —— 并发容器 ConcurrentLinkedDeque
    文章目录ConcurrentLinkedDeque特点构造方法常用方法使用示例注意事项ConcurrentLinkedDequeConcurrentLinkedDeque是Java并发工具包(java.util.concurrent包)中的一个线程安全的双端队列(Deque)实现,实现了Deque接口。它使用了链表结构,并且针对高并发环境进行了......
  • 网络编程
    网络编程可以让设备中的程序与网络上的其他设备中的程序进行数据交互,实现网络通信。基本的通信架构基本通信架构有两种:CS架构(Client客户端/Server服务端)、BS架构(Browser浏览器/Server服务端)。网络通信三要素InetAddress(IP地址)publicclasstest{publicstaticvoidmain(Stri......
  • Python面向对象编程:学生类的实现与应用
    在现代编程中,面向对象编程(Object-OrientedProgramming,OOP)是一种非常重要的编程范式。它通过类和对象的概念,将现实世界的实体抽象成程序中的对象,从而实现对复杂系统的建模。本文将通过一个简单的学生类的例子,带大家了解如何使用Python实现面向对象编程。一、代码简介下面......
  • 面向对象编程的学习路线
    一、基础概念面向对象编程的基本概念面向对象编程是一种编程范式,它将数据和操作数据的方法封装在对象中。通过使用类和对象,我们可以更好地组织和管理代码。在面向对象编程中,我们可以使用继承、多态和封装等特性来提高代码的可重用性、可扩展性和可维护性。学习面向对象编程的基本概......
  • 哪种编程语言在未来更有“钱途”
    在科技迅猛发展的今天,编程语言的选择对于职业发展和薪资水平有着深远的影响。尤其是在职场中,对于技术栈的选择不仅仅关乎工作的兴趣和发展,更直接关系到未来的经济回报。Python、Rust、Golang、C++和Java是当前市场上极具影响力的编程语言,它们各自有着不同的应用场景和行业需求......
  • 网络编程基础
    五种IO模型计算机编程中,IO模型是描述程序与输入/输出操作之间交互方式的抽象概念。不同的IO模型可以影响程序的性能、可扩展性和资源利用效率。我们常见有五种IO模型:阻塞式IO、非阻塞式IO、IO多路复用、信号驱动IO、异步IO。阻塞式IOlistenfd=socket();//打开......
  • js逆向基础14异步编程3
    上节课遗留.finally.finally()方法不管Promise对象最后的状态如何都会执行.finally()方法的回调函数不接收任何的参数,也就是你在.finally()函数中是没法知道Promise最终的状态是resolved还是rejected的它最终返回的默认会是一个上一次的Promise对象值,不过抛出的是一个异常......
  • windows C++-并行编程-转换使用异常处理的 OpenMP 循环以使用并发运行时
    此示例演示如何将执行异常处理的OpenMP并行for循环转换为使用并发运行时异常处理机制。在OpenMP中,在并行区域中引发的异常必须由同一线程在同一区域中捕获和处理。未处理的异常处理程序会捕获逃离并行区域的异常,默认情况下会终止进程。在并发运行时中,在传递给任务组(例......