即时通讯开发之TCP 连接的建立与中止

news2024/9/21 4:25:02

TCP 是一个面向连接的协议,所以在连接双方发送数据之前,都需要首先建立一条连接。这和前面讲到的协议完全不同。前面讲的所有协议都只是发送数据 而已,大多数都不关心发送的数据是不是送到,UDP 尤其明显,从编程的角度来说,UDP 编程也要简单 的多----UDP 都不用考虑数据分片。

 

书中用 telnet 登陆退出来解释 TCP 协议连接的建立和中止的过程,可以看到,TCP 连接的建立可以简单的称为三次握手,而连接 的中止则可以叫做四次握手。

在建立连接的时候,客户端首先向服务器申请打开某一个端口(用 SYN 段等于1的 TCP 报文),然后服务器端发回一个 ACK 报文 通知客户端请求报文收 到,客户端收到确认报文以后再次发出确认报文确认刚才服务器端发出的确认报文(绕口么),至此,连接的 建立完成。这就叫做三次握手。如果打算让双方都做好 准备的话,一定要发送三次报文,而且只需要三次报文就可以了。

可以想见,如果再加上 TCP 的超时重传机制,那么 TCP 就完全可以保证一个数据包被送到目的地。

TCP 有一个特别的概念叫做 half-close,这个概念是说,TCP 的连接是全双工(可以同时发送和接收)连接,因此在关闭 连接的时候,必须关闭传和送两个方向上的连接。客户机给服务器一个 FIN 为1的 TCP 报文,然后服务器返回给客户端一个确认 ACK 报文, 并且发送一个 FIN 报文,当客户机回复 ACK 报文后(四次握手),连接就结束了。

在建立连接的时候,通信的双方要互相确认对方的最大报文长度(MSS),以便通信。一般这个 SYN 长度是 MTU 减去固定 IP 首部 和 TCP 首部长度。 对于一个以太网,一般可以达到1460字节。当然如果对于非本地的 IP,这个 MSS 可能就只有536字节,而且,如 果中间的传输网络的 MSS 更佳的小的 话,这个值还会变得更小。即时通讯聊天软件app开发可以加蔚可云的v:weikeyun24咨询

 

客户端的状态可以用如下的流程来表示: CLOSED->SYN_SENT->ESTABLISHED->FIN_WAIT_1->FIN_WAIT_2->TIME_WAIT->CLOSED 以上流程是在程序正常的情况下应该有的流程,从书中的图中可以看到,在建立连接时,当客户端收到 SYN 报文的 ACK 以后,客户端就打开了数据交互地 连接。而结束连接则通常是客户端主动结束的,客户端结束应用程序以后,需要经历 FIN_WAIT_1, FIN_WAIT_2等状态,这些状态的迁移就是前 面提到的结束连接的四次握手。

服务器的状态可以用如下的流程来表示:
CLOSED->LISTEN->SYN 收到->ESTABLISHED->CLOSE_WAIT->LAST_ACK->CLOSED 在建立连接的时候,服务器端是在第三次握手之后才进入数据交互状态,而关闭连接则是在关闭连接的第二次握手以后(注意不是第四次)。而关闭以后还要等待客户端给出最后的 ACK 包才能进入初始的状态。

书中的图还有一些其他的状态迁移,这些状态迁移针对服务器和客户端两方面的总结如下:

    LISTEN->SYN_SENT:对于这个解释就很简单了,服务器有时候也要打开连接的嘛。
    SYN_SENT->SYN:收到服务器和客户端在 SYN_SENT 状态下如果收到 SYN 数据报,则都需要发送 SYN 的 ACK 数据报并把自己的状态调整到 SYN 收到状态,准备进入 ESTABLISHED
    SYN_SENT->CLOSED:在发送超时的情况下,会返回到 CLOSED 状态。
    SYN_收到->LISTEN:如果受到 RST 包,会返回到 LISTEN 状态。
    SYN_收到->FIN_WAIT_1:这个迁移是说,可以不用到 ESTABLISHED 状态,而可以直接跳转到 FIN_WAIT_1状态并等待关闭。

书中给的图里面,有一个 TIME_WAIT 等待状态,这个状态又叫做2MSL 状态,说的是在 TIME_WAIT2发送了最后一个 ACK 数 据报以后, 要进入 TIME_WAIT 状态,这个状态是防止最后一次握手的数据报没有传送到对方那里而准备的(注意这不是四次握手, 这是第四次握手的保险状态)。这个 状态在很大程度上保证了双方都可以正常结束,但是,问题也来了。

由于插口的2MSL 状态(插口是 IP 和端口对的意思,socket),使得应用程序在2MSL 时间内是无法再次使用同一个插口的,对于 客户程序还好 一些,但是对于服务程序,例如 httpd,它总是要使用同一个端口来进行服务,而在2MSL 时间内,启动 httpd 就会出现 错误(插口被使用)。为了避免 这个错误,服务器给出了一个平静时间的概念,这是说在2MSL 时间内,虽然可以重新启动服务器,但是这个服务器还是要平静的等待2MSL 时间的过去才能进行下一次连接。

这就是著名的半关闭的状态了,这是在关闭连接时,客户端和服务器两次握手之后的状态。在这个状态下,应用程序还有接受数 据的能力,但是已经无法发送 数据,但是也有一种可能是,客户端一直处于 FIN_WAIT_2状态,而服务器则一直处于 WAIT_CLOSE 状态,而直到应用层来决定关闭这个状态。

RST 是另一种关闭连接的方式,应用程序应该可以判断 RST 包的真实性,即是否为异常中止。而同时打开和同时关闭则是两种特 殊的 TCP 状态,发生的概率很小。

前面曾经讲述过 UDP 的服务器设计,可以发现 UDP 的服务器完全不需要所谓的并发机制,它只要建立一个数据输入队列就可以。 但是 TCP 不同,TCP 服务器对于每一个连接都需要建立一个独立的进程(或者是轻量级的,线程),来保证对话的独立性。所以 TCP 服务器是并发的。而且 TCP 还需要配备一个呼入 连接请求队列(UDP 服务器也同样不需要),来为每一个连接请求建立对话进程,这 也就是为什么各种 TCP 服务器都有一个最大连接数的原因。而根据源主机的 IP 和端口号码,服务器可以很轻松的区别出不同的会话, 来进行数据的分发。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/172341.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Ubuntu下源码编译VirtualBox一 —— 源码下载

VirtualBox想必大家都不陌生,做Linux开发的尤其是嵌入式Linux开发的人应该基本都知道或玩过VMware和VirtualBox。但通常都是为了在Windows电脑上能够使用Linux环境、即在Windows环境下通过下载可执行文件安装的VirtualBox。本文介绍在Linux环境(Ubuntu 2…

系分 - 论文 - 总览知识点

个人总结,仅供参考,欢迎加好友一起讨论 文章目录系分 - 论文 - 总览往年论文一览论文考点考试时间考试过程论文技巧论文写作论文扣分与加分系分 - 论文 - 总览 往年论文一览 一般情况下,往下数5、6年的题目出题形式,具有参考意义…

痞子衡嵌入式:盘点国内Cortex-M内核MCU厂商高主频产品(2023)

大家好,我是痞子衡,是正经搞技术的痞子。今天痞子衡给大家介绍的是国内Cortex-M内核MCU厂商高主频产品。 在 2021 年初痞子衡写了篇 《盘点国内Cortex-M内核MCU厂商高性能产品》,搜罗了当时市面上主频不低于 96MHz 的 CM 核国产 MCU。如今过去…

LSTM MultiheadAttention 输入维度

最近遇到点问题,对于模块的输入矩阵的维度搞不清楚,这里在学习一下,记录下来,方便以后查阅。 LSTM & Attention 输入维度LSTM记忆单元门控机制LSTM结构LSTM的计算过程遗忘门输入门更新记忆单元输出门LSTM单元的pytorch实现Pyt…

Spring Security in Action 第七章 配置授权:限制访问

本专栏将从基础开始,循序渐进,以实战为线索,逐步深入SpringSecurity相关知识相关知识,打造完整的SpringSecurity学习步骤,提升工程化编码能力和思维能力,写出高质量代码。希望大家都能够从中有所收获&#…

[leetcode 72] 编辑距离

题目 题目:https://leetcode.cn/problems/edit-distance/description/ 类似题目:[leetcode 583] 两个字符串的删除操作 解法 动态规划 这题应该是字符串dp的终极形态了吧🤣,不看答案完全不会…看了答案发现原来还是dp… 以例题…

未来的竞争是认知和执行力的竞争,只有认知高,强执行才能赚钱

之前很火的一句话是:你永远赚不到认知范围之外的钱所以只有持续不断地提升认知才能持续成长,持续提升,持续赚钱。未来的竞争从另一方面来说也是认知的竞争。不同的认知对待同一事物、信息有不同的理解;不同的认知对待同一事物、信…

固高科技在创业板提交注册:业绩开始下滑,实控人均为“学院派”

近日,固高科技股份有限公司(下称“固高科技”)在深圳证券交易所创业板递交注册。据贝多财经了解,固高科技于2021年12月在创业板递交上市申请,2022年8月17日获得上市委会议通过。 本次冲刺创业板上市,固高科…

【一道面试题】说一下Synchronized?

说一下Synchronized? Synchronized锁是Java中为了解决线程安全问题的一种方式,是一种悲观锁Synchronized可以用来修饰方法或者以代码块,用来保证线程执行方法或代码块时的原子性Java中任何一个类的对象都可以用来作为锁对象,但是…

docker-15-镜像Ubuntu20.04中安装python3.9

1 拉取并运行镜像 从docker hub 拉取镜像,以ubuntu20.04为例: docker pull ubuntu:20.04 docker run -it ubuntu:20.04 /bin/bash发现命令行变为root1234abcd5678:,这样就是进入docker容器里了。以下是docker常用的命令: # 以…

8086到80386汇编数据传送指令的扩展

80386及以上汇编的数据传送指令如下; MOV 传送字或字节. MOVSX 先符号扩展,再传送. MOVZX 先零扩展,再传送. PUSH 把字压入堆栈. POP 把字弹出堆栈. PUSHA 把AX,CX,DX,BX,SP,BP,SI,DI依次压入堆栈. POPA 把DI,SI,BP,SP,BX,DX,CX,A…

人大金仓数据库KSQL常用命令

第三章KSQL常用命令 登陆前显示ksql的帮助命令 Ksql --help 列出所有的SQL命令清单 test# \h 列出某个SQL命令语法大纲 \h <sql命令> 如&#xff1a;\h delect 查看ksql元命令的帮助 ..... 查看数据库列表 显示当前连接的数据库和登录用户 \c 显示当前test数据库的…

数学和统计方法

平均数&#xff0c;加权平均数&#xff0c;中位数&#xff0c;众数 1、平均数&#xff1a;所有数加在一起求平均 2、中位数&#xff1a;对于有限的数集&#xff0c;可以通过把所有观察值高低排序后找出正中间的一个作为中位数。如果观察值有偶数个&#xff0c;通常取最中间的 …

Spring Boot学习篇(十一)

Spring Boot学习篇(十一) shiro安全框架使用篇(三) 1.shiro过滤地址配置(部分地址必须要登录才能访问) 1.1 在controll包下创建CRUDController类(用于提供地址进行测试),其内容如下所示 package com.zlz.controller;import org.springframework.stereotype.Controller; imp…

回顾一次后台从war包启动到jar包启动的改造

一、背景描述 1.项目情况 有个项目后台一开始是war包部署到tomcat中部署的 配置文件放在项目中 考虑到这种部署方式相对spring boot项目内置tomcat部署不太便捷&#xff0c;配置也没有独立出来&#xff0c;考虑将原来的spring mvc项目稍微改造为spring boot项目。 2.要求 1&am…

Linux设备树的概念

一.设备树概念以及作用1.设备树概念设备树(Device Tree)&#xff0c;将这个词分开就是“设备”和“树”&#xff0c;描述设备树的文件叫做 DTS(DeviceTree Source)&#xff0c;这个 DTS 文件采用树形结构描述板级设备&#xff0c;也就是开发板上的设备信息&#xff0c;比如CPU …

flowable的Task使用

ReceiveTask UserTask ServiceTask ScriptTask ReceiveTask 执行到这个ReceiveTask会停下来&#xff0c;需要人工触发一下&#xff0c;才会继续执行 ClassPathResource classPathResource new ClassPathResource("processes/ReceiveTaskDemo.bpmn20.xml");String f…

C++——模板与STL标准模板库

目录 一、模板 1.1类型模板 1.2非类型模板 二、STL 2.1链表实现 2.2迭代器 2.3STL容器 2.4STL算法 三、模板特化的匹配规则 (1) 类模板的匹配规则 (2) 函数模板的匹配规则 一、模板 1.1类型模板 #include <stdio.h> #include <iostream>using namespac…

深度学习 GAN生成对抗网络-手写数字生成及改良

如果你有一定神经网络的知识基础&#xff0c;想学习GAN生成对抗网络&#xff0c;可以按顺序参考系列文章&#xff1a; 深度学习 自动编码器与生成模型 深度学习 GAN生成对抗网络-1010格式数据生成简单案例 深度学习 GAN生成对抗网络-手写数字生成 一、前言 在前面一篇文章&am…

877. 石子游戏

877. 石子游戏题目算法设计&#xff1a;奇偶算法设计&#xff1a;动态规划题目 算法设计&#xff1a;奇偶 最简单的情况&#xff0c;只有2堆石子&#xff08;石子奇数&#xff09;&#xff0c;先稳赢。 但是四堆情况不同了&#xff0c;如 [3 7 2 3]。 不能直接选最大的&…