C++中的网络协议和网络框架TCP和HTTP

一.OSI七层网络模型

即开放式系统互连。 一般都叫OSI参考模型,是ISO组织在1985年研究的网络互连模型。该体系结构标准定义了网络互连的七层框架(物理层、数据链路层、网络层、传输层、会话层、表示层和应用层),即OSI开放系统互连参考模型。
应用层:HTML class,HTTP APIserver
表示层:CSS,GIF,XML,JSON
会话层:FTP,HTTP,HTTPS,SMTP,Telnet
传输层:TCP,UDP
网络层:IPV4,IPV6,ICMP
数据链路层:IEEE802.2,MAC,ATM
物理层:RS-232

二.TCP 传输协议

TCP 协议:TCP是一个面向连接的,安全的,流式传输协议,这个协议是一个传输层协议。
面向连接:是一个双向连接,通过三次握手完成,断开连接需要通过四次挥手完成。
安全:tcp通信过程中,会对发送的每一数据包都会进行校验, 如果发现数据丢失, 会自动重传
流式传输:发送端和接收端处理数据的速度,数据的量都可以不一致

1.三次握手

第一次握手:客户端向服务端发送连接请求包,标志位SYN(同步序号)置为1,顺序号码为X=0。
第二次握手:服务端收到客户端发过来报文,由SYN=1知道客户端要求建立联机,则为这次连接分配资源。并向客户端发送一个SYN和ACK都置为1的TCP报文,设置初始顺序号码Y=0,将确认序号(ack)设置为上一次客户端发送过来的顺序号(Seq)加1,即X+1 = 0+1=1。
第三次握手:客户端收到服务端发来的包后检查确认号码(ack)是否正确,即第一次发送的Seq加1(X+1=1)。以及标志位ACK是否为1。若正确,服务端再次发送确认包,ACK标志位为1,SYN标志位为0。确认号码(ack)=Y+1=0+1=1,发送顺序号码(Seq)为X+1=1。Server收到后确认号码值与ACK=1则连接建立成功,可以传送数据了。

2.四次挥手

为什么关闭的时候却是四次挥手?
因为当Server端收到Client端的SYN连接请求报文后,可以直接发送SYN+ACK报文。其中ACK报文是用来应答的,SYN报文是用来同步的。但是关闭连接时,当Server端收到FIN报文时,很可能并不会立即关闭SOCKET,所以只能先回复一个ACK报文,告诉Client端,“你发的FIN报文我收到了”。只有等到我Server端所有的报文都发送完了,我才能发送FIN报文,因此不能一起发送。故需要四步握手。
第一次挥手:客户端给服务端发送FIN报文,用来关闭客户端到服务端的数据传送。将标志位FIN和ACK置为1,顺序号码为X=1,确认号码为Z=1。意思是说”我Client端没有数据要发给你了,但是如果你还有数据没有发送完成,则不必急着关闭Socket,可以继续发送数据。所以你先发送ACK过来。”
第二次挥手:服务端收到FIN后,发回一个ACK(标志位ACK=1),确认号码为收到的顺序号码加1,即X=X+1=2。顺序号码为收到的确认号码=Z。意思是说“你的FIN请求我收到了,但是我还没准备好,请继续你等我的消息" 这个时候客户端就进入FIN_WAIT状态,继续等待服务端的FIN报文。
第三次挥手:当服务端确定数据已发送完成,则向客户端发送FIN报文,关闭与客户端的连接。标志位FIN和ACK置为1,顺序号码为Y=1,确认号码为X=2。意思是告诉Client端“好了,我这边数据发完了,准备好关闭连接了。”
第四次挥手:客户端收到服务器发送的FIN之后,发回ACK确认(标志位ACK=1),确认号码为收到的顺序号码加1,即Y+1=2。顺序号码为收到的确认号码X=2。意思是“我Client端知道可以关闭连接了,但是我还是不相信网络,怕 Server端不知道要关闭,所以发送ACK后进入TIME_WAIT状态,如果Server端没有收到ACK则可以重传。Client端等待了2MSL后依然没有收到回复,则证明Server端已正常关闭,那好,我Client端也可以关闭连接了。“(在TIME_WAIT状态中,如果TCP client端最后一次发送的ACK丢失了,它将重新发送。TIME_WAIT状态中所需要的时间是依赖于实现方法的。典型的值为30秒、1分钟和2分钟。等待之后连接正式关闭,并且所有的资源(包括端口号)都被释放。)

3.socket编程
(1).主机字节序:

大端:数据的高位字节存储到内存的低地址位
小端:数据的高位字节存储到内存的高地址位
套接字通信过程中操作的数据都是大端存储的,包括:接收/发送的数据、IP地址、端口
PC机上数据的存储默认使用的是小端
主机字节序到网络字节序的转换函数:htons、htonl;从网络字节序到主机字节序的转换函数:ntohs、ntohl

(2).socket函数:

创建套接字socket,返回文件描述符,这个文件描述符来操作内存,实现网络通信
调用绑定函数bind,将文件描述符和本地的IP与端口进行绑定
调用监听listen给监听的套接字设置监听
调用accept阻塞并等待接受客户端的连接请求, 建立新的连接, 会得到一个新的文件描述符(通信的)
连接成功后,通过调用read和recv来接收数据,如果连接没有断开,接收数据的函数会阻塞等待数据到达,数据到达后函数解除阻塞,开始接收数据,当发送端断开连接,接收端无法接收到任何数据,但是这时候就不会阻塞了,函数直接返回0
通过调用write和send发送数据
通过调用close来关闭套接字

三.HTTP协议

1.HTTP请求头

Accept接收的介质类型
Accept-Charset接受的字符集

2.MFC中Http开发

CInternetSession,创建并初始化一个或多个同时的Internet 会话
CHttpConnection,包含一个构造函数和一个成员函数OpenRequest,使用HTTP协议来管理与服务器的连接
CHttpFile,提供请求和读取 HTTP 服务器上数据和文件的功能;

3.Qt中Http开发

使用QNetworkReply,QNetworkRequest,QNetworkAccessManager
封装成常用的同步和异步的Get请求,Post字串方式请求,Post键值对方式请求等

4.curl开源库Http开发

libcurl是一个多协议的便于客户端使用的URL传输库,基于C语言,提供C语言的API接口,支持DICT, FILE, FTP, FTPS, Gopher, HTTP, HTTPS, IMAP, IMAPS, LDAP, LDAPS, POP3, POP3S, RTMP, RTSP, SCP, SFTP, SMTP, SMTPS, Telnet 及TFTP这些协议,同时支持使用SSL证书的安全文件传输:HTTP POST, HTTP PUT, FTP 上传, 基于HTTP形式的上传、代理、Cookies、用户加密码的认证等多种应用场景。另外,libcurl是一个高移植性的库,能在绝大多数系统上运行,包括Windows,Linux ,Mac OS,Solaris, NetBSD, FreeBSD, OpenBSD, HPUX AIX, Tru64, UnixWare, HURD, Amiga, BeOs, Ultrix, QNX, OpenVMS, RISC OS, Novell NetWare, DOS等
libcurl提供了两种接口,分别是easy interface和multi interface。easy interface以同步的方式进行数据传输,执行curl函数时会一直阻塞到数据传输完毕后返回,且一次操作只能发送一次请求,如果要同时发送多个请求,必须使用多线程。 而multi interface以一种简单的、非阻塞、异步的方式进行传输,它允许在一个线程中,同时提交多个相同类型的请求。 在使用multi interface之前,应该先掌握easy interface的基本使用。因为multi interface是建立在easy interface基础之上的,它只是简单的将多个easy handler添加到一个multi stack,而后同时传输而已

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

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

相关文章

牛筋面,一口难忘的劲道滋味

在众多的平凉美食中,牛筋面以其独特的口感和丰富的口味,赢得了无数食客的喜爱。牛筋面,这一名字就给人一种坚韧、有嚼劲的印象。它并非由牛筋制成,而是因其面条的口感如牛筋般劲道而得名。牛筋面的制作过程颇具巧思。选用优质的面…

sheng的学习笔记-AI-K均值算法

ai目录:sheng的学习笔记-AI目录-CSDN博客 需要学习前置知识:聚类,可参考 sheng的学习笔记-聚类(Clustering)-CSDN博客 目录 什么是k均值算法 流程 伪代码 数据集 伪代码 代码解释 划分示意图 优化目标 随机初始化 选择聚类数…

工作目录问题,明明有该文件却import错误?

背景 最近在进行多模块集成的时候,出现了import错误的现象,虽然直接用绝对目录解决了,但是显然不优雅,在复习了有关工作目录的知识后,了解到了问题所在。故写此博客,希望对读者有所帮助。 场景说明 有两…

Interposer, 基板,转接板

2. 结构与材料 3. 应用领域 4. 总结 Interposer、基板和转接板在电子封装和连接技术中各自扮演着不同的角色,以下是对它们之间区别的清晰解释: 1. 定义与功能 Interposer: 定义:Interposer是一种中介层技术,用于实现芯片之间的水平互连和垂直互连。功能:通常是一个薄型的…

鸿蒙期末项目(3)

服务器搭建完成之后,编写了诸多api用于数据传输工作(略) 编写完成之后,回到鸿蒙开发工具,开始编写搜索页面的代码。 打开搜索页面时,先会展示历史搜索记录(如果有的话),…

Kafka入门到精通(四)-SpringBoot+Kafka

一丶IDEA创建一个空项目 二丶添加相关依赖 <dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.springf…

SQL 查询中 (+) 符号的含义

您已经很好地解释了 SQL 查询中 () 符号的含义&#xff0c;它确实用于表示左外连接&#xff08;LEFT OUTER JOIN&#xff09;&#xff0c;这是 SQL 中的一种连接操作。以下是对您提供的信息的补充和完善&#xff1a; ### 左外连接&#xff08;LEFT OUTER JOIN&#xff09;&…

hudi系列-schema evolution(一)

hudi+flink在非schema on read模式下也表现出了支持一部分的schema evolution功能,本篇中测试一下在非schema on read模式下,发生各种列变更情况时数据写入与读取情况。 flink 1.14.5hudi 0.13.1mor表思路: 选择mor表是因为它的数据文件有avro和parquet两种格式,能覆盖得更…

java中常用集合(边补充)

java中开发常用集合&#xff08;边补充&#xff09; 一、单列集合Collection1.1List接口1.1.1 ArrayList1.1.2 LinkedList1.1.3 Vector&#xff08;线程安全&#xff09;1.1.4 CopyOnWriteArrayList&#xff08;线程安全&#xff09; 1.2 Set接口1.2.1 HashSet1.2.2 LinkedHash…

用户订单管理API:轻松管理,购物无忧

在当今数字化时代&#xff0c;电子商务已经成为人们购物的首选方式。与传统的实体店相比&#xff0c;电商的优势在于便捷、快速、多样化等特点&#xff0c;使得更多的消费者选择了通过网络购物。而作为电商平台&#xff0c;如何提供更好的购物体验&#xff0c;是每个平台都需要…

企业工程项目管理系统源码:Java版源码解析

一、项目概述 鸿鹄工程项目管理系统是基于Spring Cloud、Spring Boot、Mybatis、Vue和ElementUI技术栈&#xff0c;采用前后端分离架构构建的工程管理软件。它旨在应对企业快速发展中的管理挑战&#xff0c;提升工程管理效率&#xff0c;减轻工作负担&#xff0c;加速信息处理…

一次关于k8s的node节点NotReady的故障排查

master现象 分析 kubectl get nodes -A 看了下pod的状态&#xff0c;好多CrashLoopBackOff kubectl get nodes -o wide 定位到那个具体node的IP地址&#xff0c;登录对应的IP去查看为什么会这样 node节点 journalctl -xe -f -u kubelet 查看此节点的 kubelet 服务&#xff…

基于SpringBoot的藏区特产销售平台

你好呀&#xff0c;我是计算机学姐码农小野&#xff01;如果有相关需求&#xff0c;可以私信联系我。 开发语言&#xff1a; Java 数据库&#xff1a; MySQL 技术&#xff1a; SpringBoot框架 工具&#xff1a; MyEclipse 系统展示 首页 个人中心 特产信息管理 订单管…

华宽通中标长沙市政务共性能力建设项目,助力智慧政务建设新飞跃

在数字化浪潮的推动下&#xff0c;长沙市政府正积极拥抱智慧城市建设&#xff0c;以科技力量提升政务服务效能。华宽通凭借其卓越的技术实力与丰富的项目经验&#xff0c;成功中标长沙市政务共性能力建设项目&#xff0c;这无疑是对华宽通在智慧城市领域实力的高度认可。 华宽…

huggingface_hub 设置国内镜像

要设置HuggingFace Hub的国内镜像&#xff0c;你可以按照以下步骤进行操作&#xff0c;以确保从国内镜像站点下载Hugging Face模型和数据集。 1. 安装依赖 首先&#xff0c;确保你已经安装了huggingface_hub库。如果没有&#xff0c;可以通过pip进行安装&#xff1a; bash复制…

背部筋膜炎最有效的治疗方法

背部筋膜炎的引起原因可以归结为多个方面&#xff0c;以下是详细的分点表示和归纳&#xff1a; 1、慢性劳损&#xff1a;长时间使用背部&#xff0c;如经常按摩背部&#xff0c;会导致筋膜老化、发炎&#xff0c;进而引发背部筋膜炎。症状可能包括背部疼痛、痉挛、肌肉无力感等…

Python 判断for循环最后一次的6种方法

在Python中&#xff0c;通常我们不会直接判断for循环是否正在执行最后一次迭代&#xff0c;因为Python的for循环是基于可迭代对象的&#xff0c;它不知道也不关心迭代的内部状态&#xff08;比如当前是第几次迭代&#xff09;。但是&#xff0c;我们可以使用一些技巧来间接地实…

uboot环境变量操作命令setenv和saveenv

uboot启动的时候会将环境变量从flash读取到DRAM中,使用命令 setenv修改的是DRAM中环境变量,修改以后要使用saveenv命令将修改 后的环境变量保存到flash中,否则的话uboot下一次重启会继续使用以前的环境变量值.setenv setenv - set environment variables Usage: setenv seten…

LeetCode.295数据流的中位数详解

问题描述 中位数是有序整数列表中的中间值。如果列表的大小是偶数&#xff0c;则没有中间值&#xff0c;中位数是两个中间值的平均值。 例如 arr [2,3,4] 的中位数是 3 。例如 arr [2,3] 的中位数是 (2 3) / 2 2.5 。 实现 MedianFinder 类: MedianFinder() 初始化 Medi…

Advantest 93000测试机中CLOCK DOMAIN 详解

爱德万测试&#xff08;Advantest&#xff09;的V93000系列测试系统是一个高度模块化和可扩展的平台&#xff0c;专为复杂和高性能的半导体器件测试而设计&#xff0c;包括系统级芯片&#xff08;SoC&#xff09;、存储器、射频&#xff08;RF&#xff09;和混合信号器件等。在…