TCP/UDP通信

news2024/9/9 4:06:13

1、TCP/IP四层模型

TCP/IP(Transmission Control Protocol/Internet Protocol,传输控制协议/网际协议)是指能够在多个不同网络间实现信息传输的协议簇。TCP/IP协议不仅仅指的是TCP 和IP两个协议,而是指一个由FTP、SMTP、TCP、UDP、IP等协议构成的协议簇, 只是因为在TCP/IP协议中TCP协议和IP协议最具代表性,所以被称为TCP/IP协议。

TCP/IP体系中为4层模型:

  • 应用层
  • 传输层
  • 网络层
  • 网络接口层(物理层+数据链路层)

2、MAC地址、 IP地址、端口号

MAC地址:物理层里网卡的地址,设备的唯一标识,不可变。
IP地址:在网络层引入的地址,用于区分不同计算机是否属于同一子网络下。
端口号:传输层引入的概念,有了mac+ip地址,可以确定具体网络下的某一设备,但需要确定交换的数据交给哪个程序应用(进程)处理,是QQ还是微信,于是就需要端口号。
网络层建立了主机到主机的通信,传输层建立了端到端(口)的通信。

TCP、UDP

TCP:三次握手,传输确认,四次挥手
三次握手:客户端发送SYN(synchronous)数据包,服务器收到并发送SYN+ACK(acknowledgement),客户端收到并发送ACK包,连接建立。
为什么不是两次握手:这是为了防止已失效的请求报文突然又传到服务器,引起错误。假设两次握手建立连接,客户端发送SYN1包,由于网络原因,没能到达服务端,于是客户端发送SYN2包,服务端成功收到并发送SYN2+ACK建立起了连接,但此时刚开始阻塞的SYN1包恢复正常发送到服务端,服务端收到并发送SYN2+ACK,此时服务端会认为客户端发起了新的连接,从而在两次握手后进入了等待数据状态。服务端认为是两个连接,客户端认为是一个连接,造成了状态不一致。如果是在3次握手的情况下,服务端收不到最后的ACK包,那么自然认为未建立连接。所以3次握手本质是为了解决信道不靠谱的问题。

建立连接后,客户、服务端都进入了数据传输状态。一包数据有可能被拆成多包发送,这些数据包到达的先后顺序不同,针对丢包问题乱序问题
TCP协议为每一个连接建立了一个发送缓冲区,从建立连接后的第一个字节的序列号为0,后面每个字节的序列号+1.
发送数据时,取其中一部分组成发送报文,发送报文组成为:起始序列号:数据长度:数据内容。
收到回复确认后的ACK,如图所示,继续发送下一包数据。
这样一问一答的方式,能够使发送端发送的数据确认被接收方收到,发送端也可以一次性发送多包的数据

该过程不分客户端和服务端,TCP连接是全双工的。
四次挥手:处于连接状态的服务端和客户端。都可以发起关闭连接请求。
在这里插入图片描述
假设客户端主动发起关闭连接请求,他先发送一个FIN(finish)包,表示要关闭连接,自己进入终止等待1状态(FIN-WAIT-1),这是第一次挥手;服务端发送一ACK包,表示自己进入了关闭等待状态,客户端进入终止等待2状态,这是第二次挥手;服务端此时还可以发送未发送的数据,客户端还可以接收数据,待服务端发送完数据后,发送一个FIN包,进入最终确认状态,这是第三次挥手;客户端收到发送ACK包,进入超时等待状态(TIME-WAIT),经过一段超时时间后关闭连接,这是第四次挥手,而服务端收到ACK包后立即关闭连接。
为什么客户端需要等待超时时间这是为了保持对方收到ACK包,因为不等待超时时间,假设ACK包丢失,服务端将一直停留在最终确认状态。而有了超时时间,服务端长时间没有收到ACK包,将重发FIN包,此时客户端会相应这个FIN包重新发送ACK包并刷新超时时间,这和三次握手一样,也是为了在不可靠的网络链路中进行可靠的连接断开。

UDP协议是基于非连接的,发送数据只是把数据包封装一下就发送出去,数据包之间没有状态上的联系,因此性能损耗非常少,CPU资源占用也远小于TCP,但对于数据丢包不能保证,适用于实时性要求高,对少量丢包无太大要求的场景。

Socket

Socket是应用层与TCP/IP协议族通信的中间软件抽象层,它是一组接口,它把复杂的TCP/IP协议族隐藏在Socket接口后面。
网络中的进程是通过socket来通信的,那什么是socket呢?socket起源于Unix,而Unix/Linux基本哲学之一就是“一切皆文件”,都可以用“打开open –> 读写write/read –> 关闭close”模式来操作。Socket就是该模式的一个实现,socket即是一种特殊的文件,一些socket函数就是对其进行的操作(读/写IO、打开、关闭)
在这里插入图片描述

服务器端先初始化Socket,然后与端口绑定(bind),对端口进行监听(listen),调用accept阻塞,等待客户端连接。在这时如果有个客户端初始化一个Socket,然后连接服务器(connect),如果连接成功,这时客户端与服务器端的连接就建立了。客户端发送数据请求,服务器端接收请求并处理请求,然后把回应数据发送给客户端,客户端读取数据,最后关闭连接,一次交互结束。

//domain 协议域,决定了socket的地址类型
//type socket类型,常见的SOCK_STREAM、SOCK_DGRAM、SOCK_RAW、SOCK_PACKET等
//#protocol 协议,如IPPROTO_TCP、IPPTOTO_UDP等
int socket(int domain, int type, int protocol);

//sockfd socket描述字,通过socket()函数创建的
//addr指向要绑定给sockfd的协议地址
//addrlen 对应的是地址的长度 
//通常服务器在启动的时候都会绑定一个众所周知的地址(如ip地址+端口号)
int bind(int sockfd, const struct sockaddr *addr, socklen_t addrlen);

//sockfd 要监听的socket描述字
//backlog 相应socket可以排队的最大连接个数
int listen(int sockfd, int backlog);

//sockfd 客户端的socket描述字
//addr 服务器的socket地址
//addrlen socket地址的长度
//客户端通过调用connect函数来建立与TCP服务器的连接
int connect(int sockfd, const struct sockaddr *addr, socklen_t addrlen);

//sockfd 服务器的socket描述字
//addr 客户端的协议地址
//addrlen 协议地址的长度
//如果accpet成功,那么其返回值是由内核自动生成的一个全新的描述字,代表与返回客户的TCP连接
int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen);

//此时已经建立连接,接着就是通信了 读写Socket
ssize_t read(int fd, void *buf, size_t count);
ssize_t write(int fd, const void *buf, size_t count);
ssize_t send(int sockfd, const void *buf, size_t len, int flags);
ssize_t recv(int sockfd, void *buf, size_t len, int flags);

ssize_t sendto(int sockfd, const void *buf, size_t len, int flags,
            	 const struct sockaddr *dest_addr, socklen_t addrlen);
ssize_t recvfrom(int sockfd, void *buf, size_t len, int flags,
               	struct sockaddr *src_addr, socklen_t *addrlen);

ssize_t sendmsg(int sockfd, const struct msghdr *msg, int flags);
ssize_t recvmsg(int sockfd, struct msghdr *msg, int flags);

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

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

相关文章

【Linux】make/Makefile的理解

1.make是一个命令,makefile是一个文件, 依赖关系和依赖方法. a.快速使用一下 i.创建一个Makefile文件(首字母也可以小写) b.依赖关系和依赖方法 i.依赖关系: 我为什么要帮你? mybin:mytest.c ii.依赖方法: 怎么帮? gcc -o mybin mytest.c make之前要注意先创建…

每期一个小窍门: 使用Gin 与 client-go 操作k8s (中)

本文承接上文 每期一个小窍门: 使用Gin 与 client-go 操作k8s (上) 后面应该还会有个下 应该是个operator的全程demo 项目结构如下 client.go package clientimport ("k8s.io/client-go/discovery""k8s.io/client-go/kubernetes"…

使用easypoi读取Excel模板

1、只读取一个脚本号Excel2、读取多个脚本号的sheet…Excel 1、只读取sheet0(只读取一个脚本号的Excel) 前言&#xff1a;引入pom文件 <dependency><groupId>com.alibaba</groupId><artifactId>easyexcel</artifactId><version>3.3.2</…

OV SSL证书申请指南

OV SSL证书除了验证域名所有权外还需要验证组织信息&#xff0c;这类证书适用于对公司官网、品牌、安全性等有较高程度要求的企业级用户。具体申请流程如下&#xff1a; 一 、注册账号 注册账号填写230919注册码即可获得大额优惠券和全程一对一技术支持https://www.joyssl.co…

网页速度如何优化?从10s到0.5s

如何排除网页速度慢的故障&#xff1f; 优化运行缓慢的网页涉及多个层面的改进&#xff0c;可分为硬件、前端和后台优化。下面是一份全面的指南&#xff1a; 01 硬件优化 服务器资源 升级服务器&#xff1a;确保服务器能为流量提供足够的资源&#xff08;CPU、内存、带宽等&a…

【Windows】Mountain Duck(FTP服务器管理工具)软件介绍

软件介绍 Mountain Duck是一款基于Cyberduck开发的应用程序&#xff0c;它允许用户通过FTP、SFTP、WebDAV、S3和OpenStack Swift等协议连接到云存储和远程服务器&#xff0c;并在本地文件浏览器中以熟悉的方式访问和管理这些文件。 功能特点 支持多种协议: Mountain Duck支持…

右键没有压缩选项

想压缩文件选中右键没有压缩选项。 打开任意rar文件 选择选项-》设置&#xff0c;添加到winrar到开始菜单即可

HTML+CSS+JavaScript实现烟花绽放的效果源码

源码 复制粘贴代码 在同级别下放一张图片fire.png接可以了 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><…

AI多模态模型架构之输出映射器:Output Projector

〔探索AI的无限可能&#xff0c;微信关注“AIGCmagic”公众号&#xff0c;让AIGC科技点亮生活〕 本文作者&#xff1a;AIGCmagic社区 刘一手 前言 AI多模态大模型发展至今&#xff0c;每年都有非常优秀的工作产出&#xff0c;按照当前模型设计思路&#xff0c;多模态大模型的…

QChart笔记6:显示点的值、显示点坐标值

在QChart笔记2: 添加鼠标悬停显示和格式处理_qchart 折线图 响应鼠标显示数据-CSDN博客上修改而来。 在笔记2中&#xff0c;通过鼠标悬停的方式显示了坐标轴Y的值&#xff0c;如果要一直显示应该怎么写呢&#xff1f;比如要达到下面的效果。 核心是这句&#xff1a; series1-…

Windows10安装——制作U盘启动盘(保姆级)

安装前准备&#xff1a; 一个不少于8G的U盘&#xff0c; 一个可以上网的windows电脑&#xff1b; 第一步&#xff1a;安装启动盘制作工具 首先我们下载启动盘制作工具&#xff0c; 官网网址&#xff1a;下载 Windows 10 (microsoft.com)&#xff1b; 百度网盘下载&#xf…

赛氪网受邀参加中国国际科技促进会第五届第五次常务理事扩大会议

2024年7月27日&#xff0c;环球赛乐&#xff08;北京&#xff09;科技有限公司&#xff08;以下简称“赛氪网”&#xff09;受邀参加了中国国际科技促进会第五届第五次常务理事扩大会议。此次会议汇聚了众多科技界的精英和专家&#xff0c;共同探讨科技发展的新方向&#xff0c…

【Mybatis】xml 配置文件

Mybatis的开发有两种方式&#xff1a; 注解XML 使用Mybatis的注解方式&#xff0c;主要是来完成一些简单的增删改查功能。 如果需要实现复杂的SQL功能&#xff0c;建议使用XML来配置映射语句&#xff0c;也就是将SQL语句写在XML配置文件中。在Mybatis中使用XML映射文件方式开…

Cxx primer-chap10-Generic Algorithms

generic algorithms的解释&#xff1a;&#xff0c;具体而言iterator使得算法与容器类型无关&#xff1a;&#xff0c;但算法的实现成功与否有时依赖于&#xff08;element type&#xff09;元素类型&#xff1a;通用算法的实现依赖于iterator&#xff0c;具体而言algorithm –…

python windows环境部署

在官网安装www.python.org linux系统的只能编译安装 windows的可以直接安装 这里是windows安装 .3.9.6版本 一直下一步就可以&#xff0c;然后鼠标右键在按住shift用终端打开 输入py或者python验证一下是否安装成功 打开目录文件夹 在里面新建一下pip的文件夹&#xff0c;里…

OpenAI开发了一种新方法来教授AI模型与安全政策保持一致

OpenAI 宣布了一种新的方法来教授人工智能模型与安全政策保持一致&#xff0c;这种方法被称为"基于规则的奖励"&#xff08;Rules Based Rewards&#xff09;。据 OpenAI 安全系统负责人 Lilian Weng 介绍&#xff0c;基于规则的奖励&#xff08;RBR&#xff09;可以…

【研发日记】Matlab/Simulink技能解锁(十一)——Stateflow中的en、du、ex应用对比

文章目录 前言 项目背景 en类型 du类型 ex类型 组合类型 分析和应用 总结 参考资料 前言 见《【研发日记】Matlab/Simulink技能解锁(六)——六种Simulink模型架构》 见《【研发日记】Matlab/Simulink技能解锁(七)——两种复数移相算法》 见《【研发日记】Matlab/Simul…

盘点适合新手使用的4个剪辑工具。

很多宝子们都觉得剪辑很难&#xff0c;想学习又觉得自己没有专业的剪辑知识指导&#xff0c;不好上手。那是因为不知道有这些工具&#xff0c;这4款专业的剪辑软件对新手来说简直就是福音。 1、福昕剪辑 直达链接&#xff1a;www.pdf365.cn/foxit-clip/ 这个软件的界面设置的…

cGDB 调试方法

用法总结 Ubuntu系统&#xff0c;安装cGDB sudo apt updatesudo apt install cgdb 编译代码 g -g -o example example.cpp -lpthread要确保有 -g &#xff0c;代码是调试信息编译的 启动测试&#xff1a;cgdb ./可执行文件 此处可以使用esc进入命令模式&#xff0c;vim命令上下…