当前位置: 首页 > news >正文

TCP通信流程以及一些TCP的相关概念

1.TCP和UDP区别

都为传输层协议
UDP:用户数据报协议,面向无连接,可以单播,多播,广播,面向数据报,不可靠
TCP:传输控制协议,面向连接的,可靠的,基于字节流,仅支持单播传输

UDPTCP
是否创建连接无连接面向连接
是否可靠不可靠可靠的
连接的对象个数一对一、一对多、多对一、多对多一对一
传输的方式面向数据报面向字节流
首部开销8个字节最少20个字节
适用场景实时应用(视频会议,直播)可靠性高的应用

2.TCP通信流程

(1) 服务器端
1.创建一个用于监听的套接字
      -监听:监听有客户端的连接
      -套接字:就是一个文件描述符
2.将这个监听文件描述符和本地的IP和端口绑定(IP和端口就是服务器的地址信息)
      -客户端连接服务器的时候使用的就是这个IP和端口
3.设置监听,监听的fd开始工作
4.阻塞等待,当有客户端发起连接,解除阻塞,接受客户端的连接,会得到一个和客户端通信的套接字(fd)
5.通信
      -接收数据
      -发送数据
6.通信结束,断开连接

(2) 客户端
1.创建一个用于通信的套接字(fd)
2.连接服务器,需要指定连接的服务器的IP和端口3.连接成功了,客户端可以直接和服务器通信
      -接收数据
      -发送数据
4.通信结束,断开连接

3.通信时所需要用到的函数(API)

int socket(int domain,int type,int protoco1);-功能:创建一个套接字-参数:- domain : 协议族AF_INET : ipv4 AF_INET6 : ipv6AF__UNIX,AF_LOCAL :本地套接字通信(进程间通信>- type : 通信过程中使用的协议类型SOCK_STREAM ︰流式协议SOCK_DGRAM︰报式协议-protoco1 : 具体的一个协议。一般写0- SOCK_STREAM︰流式协议默认使用 TCP- SOCK_DGRAM︰报式协议默认使用UDP-返回值:-成功:返回文件描述符,操作的就是内核缓冲区。-失败:-1int bind(int sockfd,const struct sockaddr *addr,socklen_t addr len);-功能:绑定,将fd 和本地的IP +端口进行绑定-参数:- sockfd :通过socketi函数得到的文件描述符- addr :需要绑定的socket地址,这个地址封装了ip和端口号的信息- addrlen :第二个参数结构体占的内存大小int listen(int sockfd,int backlog);  // /proc/sys/net/core/somaxconn-功能:监听这个socket上的连接-参数:- sockfd :通过socket()函数得到的文件描述符- backlog :未连接的和已经连接的和的最大值,5int accept(int sockfd,struct sockaddr *addr ,socklen_t *addrlen);-功能:接收客户端连接,默认是一个阻塞的函数,阻塞等待客户端连接-参数:- sockfd :用于监听的文件描述符- addr :传出参数,记录了连接成功后客户端的地址信息(ip, port)- addrlen :指定第二个参数的对应的内存大小-返回值:-成功:用于通信的文件描述符- -1 :失败
int connect(int sockfd,const struct sockaddr *addr, socklen_t addrlen) ;-功能:客户端连接服务器-参数:- sockfd :用于通信的文件描述符- addr :客户端要连接的服务器的地址信息- addrlen :第二个参数的内存大小-返回值: 成功0,失败-1
ssize_t write(int fd,const void *buf,size_t count);//写数据
ssize_t read(int fd,void *buf, size_t count);//读数据

4.TCP三次握手

目的:保证双方互相之间建立了连接
什么时候三次握手:发生在客户端连接时
为甚莫要三次握手:确认双方都能发送和接收数据
三次握手在TCP协议头中1.将SYN的值置为12.服务端将ACK置为1,并且将SYN置为13.客户端将ACK置为1
序号,确认号:确保TCP协议的传输时的完整性和顺序性

第一次握手:1.客户端将SYN标志位置为12.生成一个随机的32位的序号seq=J ,这个序号后边是可以携带数据(数据的大小)
第二次握手:1.服务器端接收客户端的连接:ACK=12.服务器会回发一个确认序号:ack=客户端的序号+数据长度+SYN/FIN(按一个字节算)3.服务器端会向客户端发起连接请求:SYN=14.服务器会生成一个随机序号:seq = K
第三次握手:1.客户单应答服务器的连接请求:ACK=12.客户端回复收到了服务器端的数据:ack=服务端的序号+数据长度+SYN/FIN(按一个字节算)

5.三次握手、滑动窗口、四次挥手

# mss: Maximum Segment Size(一条数据的最大的数据量)
# win: 滑动窗口
1. 客户端向服务器发起连接,客户单的滑动窗口是4096,一次发送的最大数据量是1460
2. 服务器接收连接情况,告诉客户端服务器的窗口大小是6144,一次发送的最大数据量是1024
3. 第三次握手
4. 4-9 客户端连续给服务器发送了6k的数据,每次发送1k
5.10次,服务器告诉客户端:发送的6k数据以及接收到,存储在缓冲区中,缓冲区数据已经处理了2k,窗口大小是2k
6.11次,服务器告诉客户端:发送的6k数据以及接收到,存储在缓冲区中,缓冲区数据已经处理了4k,窗口大小是4k
7.12次,客户端给服务器发送了1k的数据8.13次,客户端主动请求和服务器断开连接,并且给服务器发送了1k的数据
9.14次,服务器回复ACK 8194, a:同意断开连接的请求 b:告诉客户端已经接受到方才发的2k的数据c:滑动窗口2k
10.1516次,通知客户端滑动窗口的大小
11.17次,第三次挥手,服务器端给客户端发送FIN,请求断开连接
12.18次,第四次回收,客户端同意了服务器端的断开请求

6.TCP三次握手、四次挥手的状态转换

ClientServer
SYN_SENT(connect())LISTEN(listen())
SYN_RECVD
ESTABLISHEDESTABLISHED
ClientServer
FIN_WAIT_1 (close())CLOSE_WAIT
LAST_ACK(close())
FIN_WAIT_2
TIME_WAIT

主动断开连接的一方, 最后进入一个 TIME_WAIT状态, 这个状态会持续: 2msl
半关闭状态

7.端口复用

在最后的关闭时,出现TIME_WAIT状态,在此调用时,会出现端口占用的错误。所用要用端口复用

端口复用最常用的用途是:
防止服务器重启时之前绑定的端口还未释放
程序突然退出而系统没有释放端口

#include <sys/types.h>
#include <sys/socket.h>
// 设置套接字的属性(不仅仅能设置端口复用)
int setsockopt(int sockfd, int level, int optname, const void *optval, socklen_toptlen);
参数:- sockfd : 要操作的文件描述符- level : 级别 - SOL_SOCKET (端口复用的级别)- optname : 选项的名称- SO_REUSEADDR- SO_REUSEPORT- optval : 端口复用的值(整形)- 1 : 可以复用- 0 : 不可以复用- optlen : optval参数的大小
端口复用,设置的时机是在服务器绑定端口之前。
setsockopt();
bind();

相关文章:

TCP通信流程以及一些TCP的相关概念

1.TCP和UDP区别 都为传输层协议 UDP&#xff1a;用户数据报协议&#xff0c;面向无连接&#xff0c;可以单播&#xff0c;多播&#xff0c;广播&#xff0c;面向数据报&#xff0c;不可靠 TCP&#xff1a;传输控制协议&#xff0c;面向连接的&#xff0c;可靠的&#xff0c;基…...

PyTorch学习笔记(十七)——完整的模型验证(测试,demo)套路

完整代码&#xff1a; import torch import torchvision from PIL import Image from torch import nnimage_path "../imgs/dog.png" image Image.open(image_path) print(image)# 因为png格式是四个通道&#xff0c;除了RGB三通道外&#xff0c;还有一个透明度通…...

WPF开篇

一、为什么要学习WPF 大环境不好&#xff0c;公司要求逐年提高&#xff0c;既要会后端又要会客户端WPF相对于WinForm来说用户界面效果更好&#xff0c;图像更加立体化也是给自己增加一项技能&#xff0c;谨记一句话&#xff0c;技多不压身&#xff1b;多一份技能就多一份竞争力…...

linux 压缩解压缩

压缩解压缩 linux中压缩和解压文件也是很常见的 zip格式 zip格式的压缩包在windows很常见&#xff0c;linux中也有zip格式的压缩包 #压缩#zip [选项] 压缩包名 文件(多个文件空格隔开)zip 1.zip 123.txt 456.txt zip -r 2.zip /home/user1 ---------------------- -r 压缩目录 …...

centos9 mysql8修改数据库的存储路径

一、环境 系统&#xff1a;CentOS Stream release 9 mysql版本&#xff1a;mysql Ver 8.0.34 for Linux on x86_64 (MySQL Community Server - GPL) 二、修改mysql的数据库&#xff0c;存储路径 查看目录数据存储的位置 cat /etc/my.cnf操作 1、新建存放的目录&#xff0c;…...

【C++】<Windows编程中消息即事件的处理>

目录 一、注册窗口类&#xff0c;指定消息处理函数&#xff0c;捕获消息并发给处理函数 二、消息处理函数 三、通用窗口消息 四、其他消息 1.滚动条消息 2.按钮控件消息 3.按钮控件通知消息 4.按键消息 5.系统菜单等消息 6.组合框控件消息 7.组合框控件通知消息 8.列…...

数据库SQL语句使用

-- 查询所有数据库 show databases; -- 创建数据库&#xff0c;数据库名为mydatabase create database mydatabase; -- 如果没有名为 mydatabase的数据库则创建&#xff0c;有就不创建 create database if not exists mydatabase; -- 如果没有名为 mydatabase的数据库则创建…...

从零开始 Spring Cloud 12:Sentinel

从零开始 Spring Cloud 12&#xff1a;Sentinel 1.初识 Sentinel 1.1雪崩问题 1.1.1什么是雪崩问题 微服务中&#xff0c;服务间调用关系错综复杂&#xff0c;一个微服务往往依赖于多个其它微服务。 如图&#xff0c;如果服务提供者I发生了故障&#xff0c;当前的应用的部分…...

@Resurce和@Autowired的区别

Resource 和 Autowired 是 Java 中常用的两个注解&#xff0c;用于自动装配依赖对象。它们的主要区别如下&#xff1a; 来源不同&#xff1a; Resource 是 Java EE 提供的注解&#xff0c;属于 J2EE 的一部分&#xff0c;它由 JSR-250 规范定义。 Autowired 是 Spring 框架提供…...

ResNet简介

ResNet (Residual Network) 此网络于2015年&#xff0c;国人何先生提出&#xff0c;用于解决随着深度学习的层数加深造成的网络退化现象和梯度消失、梯度爆炸。 问题1 退化现象 当深度学习的各项指标能够随着训练轮数收敛的情况下&#xff0c;网络的层数增强未能像理论一样&…...

了解单例模式,工厂模式(简单易懂)

文章目录 单例模式饿汉模式懒汉模式对比 工厂模式简单工厂模式&#xff08;Simple Factory Pattern&#xff09;工厂方法模式&#xff08;Factory Method Pattern&#xff09;抽象工厂模式&#xff08;Abstract Factory Pattern&#xff09;对比 单例模式 什么是单例&#xff…...

【中危】 Apache NiFi 连接 URL 验证绕过漏洞 (CVE-2023-40037)

漏洞描述 Apache NiFi 是一个开源的数据流处理和自动化工具。 在受影响版本中&#xff0c;由于多个Processors和Controller Services在配置JDBC和JNDI JMS连接时对URL参数过滤不完全。使用startsWith方法过滤用户输入URL&#xff0c;导致过滤可以被绕过。攻击者可以通过构造特…...

【Git版本控制工具使用---讲解一】

Git版本控制工具使用 安装设置用户名签名和邮箱Git常用的命令 初始化本地库查看本地状态Git 命令添加暂存区提交本地库查看版本信息修改文件版本穿梭 安装 首先根据自身电脑的配置选择性的安装是32位的还是64位的Git版本控制工具 我这边安装的是64位的 以下是我安装的时候的过…...

NLP | 基于LLMs的文本分类任务

比赛链接&#xff1a;讯飞开放平台 来源&#xff1a;DataWhale AI夏令营3&#xff08;NLP&#xff09; Roberta-base&#xff08;BERT的改进&#xff09; ①Roberta在预训练的阶段中没有对下一句话进行预测&#xff08;NSP&#xff09; ②采用了动态掩码 ③使用字符级和词级…...

攻防世界-base÷4

原题 解题思路 base644&#xff0c;莫不是base16&#xff0c;base16解码网站&#xff1a; 千千秀字...

【Java转Go】快速上手学习笔记(三)之基础篇二

【Java转Go】快速上手学习笔记&#xff08;二&#xff09;之基础篇一 了解了基本语法、基本数据类型这些使用&#xff0c;接下来我们来讲数组、切片、值传递、引用传递、指针类型、函数、map、结构体。 目录 数组和切片值传递、引用传递指针类型defer延迟执行函数map结构体匿名…...

【vue 引入pinia与pinia的详细使用】

vue引入pinia与使用 安装引入使用定义 store在组件中使用 store在插件中使用 store配置 store 总结 Pinia 是一个用于 Vue 3 的状态管理库&#xff0c;其设计目标是提供一个简单、一致的 API 和强类型支持。下面介绍如何引入 Pinia 并使用它。 安装 npm install pinia引入 在…...

USACO18DEC Fine Dining G

P5122 [USACO18DEC] Fine Dining G 题目大意 有一个由 n n n个点 m m m条边构成的无向连通图&#xff0c;这 n n n个点的编号为 1 1 1到 n n n。前 n − 1 n-1 n−1个点上都有一头奶牛&#xff0c;这些奶牛都要前往 n n n号点。第 i i i条边连接 a i a_i ai​和 b i b_i bi​…...

fckeditor编辑器的两种使用方法

需要的资源包我放我资源里了&#xff0c;不要积分 https://download.csdn.net/download/wybshyy/88245895 首先把FredCK.FCKeditorV2.dll添加到引用 具体方法如下&#xff0c;一个是客户端版本&#xff0c;一个是服务器端版本 客户端版本&#xff1a; <% Page Language…...

数据结构,查找算法(二分,分块,哈希)

一、查找算法 1、二分查找:(前提条件: 必须有序的序列) #include <stdio.h> //二分查找 value代表的是被查找的值 int findByHalf(int *p, int n, int value) {int low = 0;//low低int high = n-1;//high高int middle;//用来保存中间位置的下标while(low <= high…...

C++(Qt)软件调试---gdb调试入门用法(12)

gdb调试—入门用法&#xff08;1&#xff09; 文章目录 gdb调试---入门用法&#xff08;1&#xff09;1、前言1.1 什么是GDB1.2 为什么要学习GDB1.3 主要内容1.4 GDB资料 2、C/C开发调试环境准备3、gdb启动调试1.1 启动调试并传入参数1.2 附加到进程1.3 过程执行1.4 退出调试 4…...

shell和Python 两种方法分别画 iostat的监控图

在服务器存储的测试中,经常需要看performance的性能曲线&#xff0c;这样最能直接观察HDD或者SSD的性能曲线。 如下这是一个针对HDD跑Fio读写的iostat监控log,下面介绍一下分别用shell 和Python3 写画iostat图的方法 1 shell脚本 环境:linux OS gnuplot工具 第一步 :解析iosta…...

设计模式(9)建造者模式

一、 1、概念&#xff1a;将一个复杂对象的构造与它的表示分离&#xff0c;使得同样的构造过程可以创建不同的表示。建造者模式主要用于创建一些复杂的对象&#xff0c;这些对象内部构建间的顺序通常是稳定的&#xff0c;但对象内部的构建通常面临着复杂的变化&#xff1b;建造…...

PHP 创业感悟交流平台系统mysql数据库web结构apache计算机软件工程网页wamp

一、源码特点 PHP 创业感悟交流平台系统&#xff08;含论坛&#xff09;是一套完善的web设计系统&#xff0c;对理解php编程开发语言有帮助&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用B/S模式开发。 源码下载&#xff1a; https://download.csdn.…...

工作流程引擎之flowable(集成springboot)

0、背景 现状&#xff1a;公司各部门业务系统有各自的工作流引擎&#xff0c;也有cross function的业务在不同系统或OA系统流转&#xff0c;没有统一的去规划布局统一的BPM解决方案&#xff0c;近期由于一个项目引发朝着整合统一的BPM方案&#xff0c;特了解一下市面上比较主流…...

leetcode54. 螺旋矩阵(java)

螺旋矩阵 题目描述解题 收缩法 上期经典算法 题目描述 难度 - 中等 原题链接 - leecode 54 螺旋矩阵 给你一个 m 行 n 列的矩阵 matrix &#xff0c;请按照 顺时针螺旋顺序 &#xff0c;返回矩阵中的所有元素。 示例1&#xff1a; 输入&#xff1a;matrix [[1,2,3],[4,5,6],[7…...

go gorm 查询

定义model package mysqltestimport ("errors""fmt""gorm.io/gorm" )type Product struct {gorm.ModelID uint gorm:"primarykey"Name string gorm:"column:name"Price float64 gorm:"column:price_value&quo…...

Flutter GetXController 动态Tabbar 报错问题

场景&#xff1a; 1.Tabbar的内容是接口获取的 2. TabController? tabController;&#xff1b; 在onInit 方法中初始化tabbarController tabController TabController(initialIndex: 0, length: titleDataList.length, vsync: this); 这时候会报一个错误 Controllers l…...

Redis(缓存预热,缓存雪崩,缓存击穿,缓存穿透)

目录 一、缓存预热 二、缓存雪崩 三、缓存击穿 四、缓存穿透 一、缓存预热 开过车的都知道&#xff0c;冬天的时候启动我们的小汽车之后不要直接驾驶&#xff0c;先让车子发动机预热一段时间再启动。缓存预热是一样的道理。 缓存预热就是系统启动前&#xff0c;提前将相关的…...

UE4/5Niagara粒子特效学习(使用UE5.1,适合新手)

目录 创建空模板 创建粒子 粒子的基础属性 粒子的生命周期 颜色 大小设置 生成的位置 Skeletal Mesh Location的效果&#xff1a; Shape Location 添加速度 添加Noise力场 在生成中添加&#xff1a; 效果&#xff1a; ​编辑 在更新中添加&#xff1a; 效果&…...

wordpress备份与还原/搜索引擎优化教材答案

一些无良的开发商为了能够从房地产交易中获取高额利润&#xff0c;会存在欺诈的情况&#xff0c;欺骗购房者。售楼人有欺诈行为可以退房。关于售楼人有欺诈行为能不能要求退房的问题&#xff0c;济南律师已经整理了如下的内容供大家做法律参考。 一、售楼人有欺诈行为能不能要求…...

建立一个网站平台需要多少钱/东莞seo外包平台

转自&#xff1a;https://www.jizhuba.com/zhichanglicai/20180119/5705.html 方法/步骤1、例如我们想删除桌面上的“123”文件夹&#xff0c;发现无法删除。2、可以这样解决&#xff1a;3、在任务栏上右击&#xff0c;然后选择“任务管理器”。4、打开“任务管理器”&#xff…...

成都最正规的装修公司/优化设计五年级下册数学答案

1、cloudera 数据压缩的一般准则 一般准则 是否压缩数据以及使用何种压缩格式对性能具有重要的影响。在数据压缩上&#xff0c;需要考虑的最重要的两个方面是 MapReduce 作业和存储在 HBase 中的数据。在大多数情况下&#xff0c;每个的原则都类似。您需要平衡压缩和解压缩数据…...

网络直播网站开发/河南seo外包

c语言大作业题目201008一、学生信息管理程序基本要求&#xff1a;1&#xff0e;要求实现学生信息的查找、添加、删除、修改、浏览、保存、从文件读取、查看奖学金信息8个功能&#xff0c;每个功能模块均能实现随时从模块中退出&#xff0c;而且可以选择不同的方式实现所需功能&…...

热门的网页设计工具有哪些/厦门百度快照优化排名

废话不多说&#xff0c;直接开始&#xff0c;整体规划如下&#xff1a; 实验通过虚拟机实现&#xff0c;基于Red Hat 5.8来完成 1.资源分析 在做实验之前&#xff0c;首先要知道高可用用于分配的资源有哪些&#xff0c;由于我们做的是Lvs DR模型Director的高可用&#xff0c;用…...

wordpress设置固定链接/推广公司产品

使用LINQ to SQL设计器设计Northwind数据库的五个类&#xff08;Product&#xff0c;Category&#xff0c;Customer&#xff0c;Order和OrderDetail&#xff09;的时候&#xff0c;每个类中的属性都映射了相应数据库中表的列&#xff0c;每个类的实例则代表了数据库表中的一条记…...