网络编程之“三次握手四次断开”

简介:       TCP的三次握手四次断开,你了解吗?作为一系统运维人员,如果您掌握了这个原理,就如虎添翼;作为一名系统开发人员,如果您不精通,当你写高并发、高性能的服务器软件时,会感觉内力不足。

      TCP的三次握手四次断开,你了解吗?作为一系统运维人员,如果您掌握了这个原理,就如虎添翼;作为一名系统开发人员,如果您不精通,当你写高并发、高性能的服务器软件时,会感觉内力不足。

客户端和服务端建立TCP连接时,需要完成那些过程?如下图:
                 

说明:

1) 客户端首先和服务端交互三个报文,建立连接。

2) 客户端首先和服务端交互四个报文,断开连接。
模拟场景:

客户端向服务端发送字符串Hello,server!  服务端接收到以后,再讲字符串发送会客户端。
          

1.客户端通过7500端口向服务端的20000端口发送一个SYN同步请求包,展开第一次握手,其中Flags [S]表求数据包的类型为SYN, 即同步请求包,seq字段标识数据包序列号。

2.服务端发送ACK确认包,同时附代一个SYN请求包,在确认客户端同步请求的同时 向客户端发送同步请求,其中Flags [S.]中的点号表示这是个确认包(ACK),S表示它同时又是一个SYN请求包。因为TCP是双工通信协议,连接建立之后双方可以同时收发数据,所以双 方都发送了SYN包请求同步。

3.客户端发送ACK包确认服务端的SYN同步请求,可以看到此时Flags中只有一个小数点,表示这个包只是用来做确认的。

到此为止,三次握手过程就结束了,双方如果都收到了ACK包,则都进入到ESTABLISHED状态,表明此时可以进行数据发送了。

4. 客户端向服务端发送一个数据包,包中的内容就是一个字符串,可以看到此时的Flags标识中有个字母P,意为PUSH DATA,就是发送数据的意思。Length=12,hello,server!

5. 服务端发送ACK确认包,其中Flags[.]中的点表示这是个确认包。

6. 服务端发送ACK确认包,其中Flags[P.]中的点表示这是个确认包,P意为PUSH DATA,发送数据的意思.length=129.

   #define BUFFER_SIZE 128

strncpy(dataBuffer,"Hello,server!",strlen("Hello,server"));

   int errSend = send(sockClient,dataBuffer,strlen(dataBuffer),0);

7. 客户端发送FIN,准备断开连接。

8. 服务器收到FIN包后,对其作出反应,发送ACK包,确认这一方向的连接将关闭,

9. 等服务器的应用程序做好关闭准备时,服务器反方向发送FIN包,请求关闭连接请求,

10. 客户机对服务器发送的请求进行确认,并发送ACK

数据传输的过程:

建立连接后,TCP 协议提供全双工的通信服务,但是一般的客户端/服务器程序的流程是由客户端主动发起请求,服务器被动处理请求,一问一答的方式。因此,服务器从 accept()返回后立刻调用read(),读socket就像读管道一样,如果没有数据到达就阻塞等待,这时客户

端调用write()发送请求给服务 器,服务器收到后从read()返回,对客户端的请求进行处理,

在此期间客户端调用read()阻塞等待服务器的应答,服务器调用write()将处理结 果发回给客

户端,再次调用read()阻塞等待下一条请求,客户端收到后从read()返回,发送下一条请求,

如此循环下去。

如果客户端没 有更多的请求了,就调用close()关闭连接,就像写端关闭的管道一样,服务

器的read()返回0,这样服务器就知道客户端关闭了连接,也调用 close()关闭连接。注意,

任何一方调用close()后,连接的两个传输方向都关闭,不能再发送数据了。如果一方调用

shutdown()则连接处于半关闭状态,仍可接收对方发来的数据。


相关实践学习
容器服务Serverless版ACK Serverless 快速入门:在线魔方应用部署和监控
通过本实验,您将了解到容器服务Serverless版ACK Serverless 的基本产品能力,即可以实现快速部署一个在线魔方应用,并借助阿里云容器服务成熟的产品生态,实现在线应用的企业级监控,提升应用稳定性。
云原生实践公开课
课程大纲 开篇:如何学习并实践云原生技术 基础篇: 5 步上手 Kubernetes 进阶篇:生产环境下的 K8s 实践 相关的阿里云产品:容器服务 ACK 容器服务 Kubernetes 版(简称 ACK)提供高性能可伸缩的容器应用管理能力,支持企业级容器化应用的全生命周期管理。整合阿里云虚拟化、存储、网络和安全能力,打造云端最佳容器化应用运行环境。 了解产品详情: https://www.aliyun.com/product/kubernetes
目录
相关文章
|
4月前
|
网络协议 开发工具
网络编程之 listen()函数的使用与三次握手的理解
listen()函数 在进入我们的函数讲解前大家再回顾一下编写服务器端的流程
46 0
|
5月前
|
缓存 网络协议 程序员
网络编程(一)计算机网络体系结构介绍(tcp三次握手,四次挥手)
网络编程(一)计算机网络体系结构介绍(tcp三次握手,四次挥手)
|
5月前
|
网络协议 Java 数据安全/隐私保护
什么是网络编程?Java如何实现?三次握手和四次挥手?
什么是网络编程?Java如何实现?三次握手和四次挥手?
35 0
|
网络协议 Oracle Java
【Java】从Java代码到网络编程,三次握手又该如何理解
文章目录 1 网络编程的相关概念 1.1 网络、网络通信与IP地址 1.2 IPv4与IPv6 1.3 域名和端口号 2 网络协议 2.1 网络通信协议 2.2 TCP和UDP 2.3 三次握手 写在最后
【Java】从Java代码到网络编程,三次握手又该如何理解
|
网络协议 安全 Java
【Java 网络编程】TCP 连接 断开 机制 ( 三次握手 | 四次挥手 )
【Java 网络编程】TCP 连接 断开 机制 ( 三次握手 | 四次挥手 )
403 0
【Java 网络编程】TCP 连接 断开 机制 ( 三次握手 | 四次挥手 )
|
网络协议
脑残式网络编程入门(一):跟着动画来学TCP三次握手和四次挥手
1、引言 网络编程中TCP协议的三次握手和四次挥手的问题,在面试中是最为常见的知识点之一。很多读者都知道“三次”和“四次”,但是如果问深入一点,他们往往都无法作出准确回答。
1827 0
|
2月前
|
网络协议 算法 Java
|
2天前
|
网络协议 算法 Java
【Java网络编程】网络编程概述、UDP通信(DatagramPacket 与 DatagramSocket)
【Java网络编程】网络编程概述、UDP通信(DatagramPacket 与 DatagramSocket)
15 3
|
3天前
|
网络协议 Dubbo Java
【网络编程】理解客户端和服务器并使用Java提供的api实现回显服务器
【网络编程】理解客户端和服务器并使用Java提供的api实现回显服务器
9 0
|
15天前
|
网络协议 Java 网络架构
Java基础教程(18)-Java中的网络编程
【4月更文挑战第18天】Java网络编程简化了底层协议处理,利用Java标准库接口进行TCP/IP通信。TCP协议提供可靠传输,常用于HTTP、SMTP等协议;UDP协议则更高效但不保证可靠性。在TCP编程中,ServerSocket用于监听客户端连接,Socket实现双进程间通信。UDP编程中,DatagramSocket处理无连接的数据报文。HTTP编程可以通过HttpURLConnection发送请求并接收响应。