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.pswp.cn/diannao/36413.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/36413.shtml
英文地址,請注明出處:http://en.pswp.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;和混合信號器件等。在…