网络通信---四次挥手

2024-08-30 21:52
文章标签 四次 挥手 网络通信

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

文章目录

  • 概述
    • 四次挥手
    • 第一次挥手:
    • 第二次挥手:
    • 第三次挥手:
    • 第四次挥手:
  • 问题:为什么是四次,而不是三次?
    • 确保数据传输完成:
    • 防止数据丢失:
    • 避免旧连接干扰:
    • 防止死锁:
    • 全双工通信:
    • 有序关闭:
    • 网络环境的不确定性:
    • 符合TCP的设计理念:
  • 小结

概述

之前写过网络编程的三次握手了。接下来聊聊四次挥手吧。

四次挥手

废话不多说,直接上图,如下:
四次挥手

第一次挥手:

主动关闭方发送一个FIN(结束)标志位被设置为1的TCP段,用来关闭主动方到被动方的数据传输。主动方进入FIN-WAIT-1状态。

第二次挥手:

被动关闭方接收到FIN后,发送一个ACK(确认)标志位被设置为1的TCP段作为回应,并且进入CLOSE-WAIT状态。主动关闭方接收到ACK后,进入FIN-WAIT-2状态。

第三次挥手:

被动关闭方发送一个FIN标志位被设置为1的TCP段,请求关闭其到主动关闭方的数据传输。

第四次挥手:

主动关闭方接收到这个FIN后,发送一个ACK标志位被设置为1的TCP段作为回应,并进入TIME-WAIT状态。经过一段时间(称为2MSL,即最大报文段生存时间的两倍)后,主动关闭方确保被动关闭方接收到了最终的ACK,然后关闭连接。

问题:为什么是四次,而不是三次?

TCP协议选择四次挥手而不是三次挥手来关闭连接,主要是基于以下几个原因:

确保数据传输完成:

四次挥手允许连接的两端独立地关闭各自的发送和接收通道。这意味着当一方完成数据发送并准备关闭连接时,另一方可能仍在发送数据。四次挥手确保了数据能够被完全传输和接收。

防止数据丢失:

在数据传输过程中,可能存在延迟的数据包。四次挥手通过TIME-WAIT状态,确保了发送方等待足够的时间,以便接收方能够接收所有在途的数据包。

避免旧连接干扰:

TIME-WAIT状态还有助于避免旧连接的数据包干扰新的连接。如果连接被重新建立,旧的延迟数据包可能会被误认为是新连接的一部分。

防止死锁:

三次挥手可能会导致死锁的情况。例如,如果双方同时发送FIN请求关闭连接,并且都等待对方的最终确认,那么如果没有额外的机制,它们可能会互相等待,导致死锁。

全双工通信:

TCP是全双工通信协议,这意味着数据可以在两个方向上独立流动。四次挥手允许每个方向独立关闭,确保了全双工通信的完整性。

有序关闭:

四次挥手提供了一个有序的关闭过程,确保了连接的两端都能够完成必要的数据传输和确认。

网络环境的不确定性:

网络环境可能存在各种不确定性,如延迟、丢包等。四次挥手通过额外的确认步骤,提高了关闭过程的健壮性。

符合TCP的设计理念:

TCP的设计目标是提供可靠、有序的数据传输服务。四次挥手机制符合这一设计理念,确保了连接关闭的可靠性和数据的完整性。

综上所述,四次挥手是TCP协议为了保证连接关闭的可靠性、有序性和数据完整性而采用的一种机制。

小结

本篇主要写了网络编程的四次挥手,先详细写了四次挥手的过程,以及每次挥手之后的tcp协议状态的改变;用以说明每次发生了什么以及原因。后边专门说明了为什么是四次挥手而不是三次。四次主要解决了哪些问题。本质上来说,三次挥手可以结束,但是基于安全,防止数据丢失等原因,还是采用了四次挥手。具体,可以参考上边答案。当然,也可以来学习学习。OK,本篇结束。

这篇关于网络通信---四次挥手的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

多路转接之select(fd_set介绍,参数详细介绍),实现非阻塞式网络通信

目录 多路转接之select 引入 介绍 fd_set 函数原型 nfds readfds / writefds / exceptfds readfds  总结  fd_set操作接口  timeout timevalue 结构体 传入值 返回值 代码 注意点 -- 调用函数 select的参数填充  获取新连接 注意点 -- 通信时的调用函数 添加新fd到

应用层简单实现udp / tcp网络通信

一、常见网络接口总结 1、创建 socket 文件描述符 (TCP/UDP, 客户端 + 服务器) int socket(int domain, int type, int protocol); domain:AF_INET:网络通信,AF_LOCAL:本地通信 type:UDP:SOCK_DGRAM,TCP:SOCK_STREAM protocol:协议编号一开始设0 返回值:文件描

“掌握Linux网络编程艺术,构建跨平台的网络通信解决方案!“#Linux系统编程之网络编程

"掌握Linux网络编程艺术,构建跨平台的网络通信解决方案!"#Linux系统编程之网络 前言预备知识一、 网络编程概述1.1 网络编程概述图1.2 TCP/UDP对比(面试)1.3 端口号的作用 二、 字节序2.1 大端字节序(Big-Endian)2.2 小端字节序(Little-Endian)2.3 字节序的重要性2.4 字节序转换函数2.5 字节序示意图 三、 socket编程步骤四

TCP网络通信服务器端简单示例

服务器端: #include <stdio.h> #include <winsock2.h> //和网络通信相关的函数的声明,类型的声明,常量的定义等都在此头文件中 #pragma comment(lib,"ws2_32.lib") int main() { //第一步:初始化Socket函数库 WSADATA wsaData; //向系统请求使用2.2版本的Socket函数库,wsaDat

udp网络通信 socket

套接字是实现进程间通信的编程。IP可以标定主机在全网的唯一性,端口可以标定进程在主机的唯一性,那么socket通过IP+端口号就可以让两个在全网唯一标定的进程进行通信。 套接字有三种: 域间套接字:实现主机内部的进程通信的编程 原始套接字:使用网络层或者数据链路层的接口进行编程,更难更底层,例如制作抓包等网络工具 网络套接字:实现用户通信的编程 udp网络通信 服务端server 分

Linux - Tcp连接建立和释放的三次握手四次挥手

一、TCP报文段首部格式         源端口/目的端口:各占2个字节,分别写入源端口和目的端口,端口是传输层与应用层的服务接口    序号:占4个字节,TCP连接中传送的数据流中每一个字节都有一个序号,序号字段指本报文段所发送的数据的第一个字节的序号    确认号:占4个字节,是期望收到对方下一个报文的第一个数据字节的序号    数据偏移:占4个字节,它指出TCP报文的数据距离TCP

JAVA—网络通信

本文是学习网络通信入门和简单了解UDP协议和TCP协议,学习和了解CS架构和简单了解BS架构和HTTP协议(部分图片来自黑马程序员) 目录 1.网络通信三要素 (1)IP地址 (2)端口号 (3)协议 2.UDP通信—快速入门 3.UDP通信—多发多收 4.TCP通信—快速入门 5.TCP通信—多发多收 6.TCP通信—同时接收多个客户端 7.TCP通信—综合

Ferrari求解四次方程

参考: 1) https://proofwiki.org/wiki/Ferrari’s_Method#google_vignette 2)https://blog.csdn.net/qq_25777815/article/details/85206702

Android 网络通信(Asynctask类的使用)

现在大部分app需要联网,所以作为开发人员就必然要了解网络通信这方面的知识。 首先要知道的一点是网络通信是耗时操作,为了不让这些耗时的任务影响界面响应,就应当使用异步任务进行处理。java是用thread,例如 new Thread(){ run(){ } }.start(); 在run()中进行网络通信处理。但Android有个重要机制,ui主线程安全机制,也就是说任何改变ui的操作

为什么http请求要3次握手与4次挥手?

https://www.zhihu.com/question/67772889 作者:eechen 链接:https://www.zhihu.com/question/67772889/answer/257170215 来源:知乎 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。 因为HTTP是一个基于TCP的协议,而TCP是一种可靠的传输层协议. 建立