TCP/IP,Http,Socket,XMPP的區別

網絡由下往上分為

物理層、數據鏈路層、網絡層、傳輸層、會話層、表示層和應用層。

通過初步的了解,我知道IP協議對應于網絡層,TCP協議對應于傳輸層,而HTTP協議對應于應用層,

三者從本質上來說沒有可比性,

socket則是對TCP/IP協議的封裝和應用(程序員層面上)。

也可以說,TPC/IP協議是傳輸層協議,主要解決數據如何在網絡中傳輸,

而HTTP是應用層協議,主要解決如何包裝數據。

關于TCP/IP和HTTP協議的關系,網絡有一段比較容易理解的介紹:

“我們在傳輸數據時,可以只使用(傳輸層)TCP/IP協議,但是那樣的話,如果沒有應用層,便無法識別數據內容。

如果想要使傳輸的數據有意義,則必須使用到應用層協議。

應用層協議有很多,比如HTTP、FTP、TELNET等,也可以自己定義應用層協議。

WEB使用HTTP協議作應用層協議,以封裝HTTP文本信息,然后使用TCP/IP做傳輸層協議將它發到網絡上。”

而我們平時說的最多的socket是什么呢,實際上socket是對TCP/IP協議的封裝,Socket本身并不是協議,而是一個調用接口(API)。

通過Socket,我們才能使用TCP/IP協議。

實際上,Socket跟TCP/IP協議沒有必然的聯系。

Socket編程接口在設計的時候,就希望也能適應其他的網絡協議。

所以說,Socket的出現只是使得程序員更方便地使用TCP/IP協議棧而已,是對TCP/IP協議的抽象,

從而形成了我們知道的一些最基本的函數接口,比如create、listen、connect、accept、send、read和write等等。

網絡有一段關于socket和TCP/IP協議關系的說法比較容易理解:

“TCP/IP只是一個協議棧,就像操作系統的運行機制一樣,必須要具體實現,同時還要提供對外的操作接口。

這個就像操作系統會提供標準的編程接口,比如win32編程接口一樣,

TCP/IP也要提供可供程序員做網絡開發所用的接口,這就是Socket編程接口。”

關于TCP/IP協議的相關只是,用博大精深來講我想也不為過,單單查一下網上關于此類只是的資料和書籍文獻的數量就知道,

這個我打算會買一些經典的書籍(比如《TCP/IP詳解:卷一、卷二、卷三》)進行學習,今天就先總結一些基于基于TCP/IP協議的應用和編程接口的知識,也就是剛才說了很多的HTTP和Socket。

CSDN上有個比較形象的描述:HTTP是轎車,提供了封裝或者顯示數據的具體形式;Socket是發動機,提供了網絡通信的能力。

實際上,傳輸層的TCP是基于網絡層的IP協議的,而應用層的HTTP協議又是基于傳輸層的TCP協議的,而Socket本身不算是協議,就像上面所說,它只是提供了一個針對TCP或者UDP編程的接口。

下面是一些經常在筆試或者面試中碰到的重要的概念,特在此做摘抄和總結。

一、什么是TCP連接的三次握手

第一次握手:客戶端發送syn包(syn=j)到服務器,并進入SYN_SEND狀態,等待服務器確認;

第二次握手:服務器收到syn包,必須確認客戶的SYN(ack=j+1),同時自己也發送一個SYN包(syn=k),即SYN+ACK包,此時服務器進入SYN_RECV狀態;

第三次握手:客戶端收到服務器的SYN+ACK包,向服務器發送確認包ACK(ack=k+1),此包發送完畢,客戶端和服務器進入ESTABLISHED狀態,完成三次握手。

握手過程中傳送的包里不包含數據,三次握手完畢后,客戶端與服務器才正式開始傳送數據。

理想狀態下,TCP連接一旦建立,在通信雙方中的任何一方主動關閉連接之前,TCP 連接都將被一直保持下去。

斷開連接時服務器和客戶端均可以主動發起斷開TCP連接的請求,斷開過程需要經過“四次握手”(過程就不細寫了,就是服務器和客戶端交互,最終確定斷開)

二、利用Socket建立網絡連接的步驟

建立Socket連接至少需要一對套接字,其中一個運行于客戶端,稱為ClientSocket ,另一個運行于服務器端,稱為ServerSocket 。

套接字之間的連接過程分為三個步驟:服務器監聽,客戶端請求,連接確認。

1、服務器監聽:服務器端套接字并不定位具體的客戶端套接字,而是處于等待連接的狀態,實時監控網絡狀態,等待客戶端的連接請求。

2、客戶端請求:指客戶端的套接字提出連接請求,要連接的目標是服務器端的套接字。

為此,客戶端的套接字必須首先描述它要連接的服務器的套接字,指出服務器端套接字的地址和端口號,然后就向服務器端套接字提出連接請求。

3、連接確認:當服務器端套接字監聽到或者說接收到客戶端套接字的連接請求時,就響應客戶端套接字的請求,建立一個新的線程,把服務器端套接字的描述發給客戶端,一旦客戶端確認了此描述,雙方就正式建立連接。

而服務器端套接字繼續處于監聽狀態,繼續接收其他客戶端套接字的連接請求。

三、HTTP鏈接的特點

HTTP協議即超文本傳送協議(Hypertext Transfer Protocol ),是Web聯網的基礎,也是手機聯網常用的協議之一,HTTP協議是建立在TCP協議之上的一種應用。

HTTP連接最顯著的特點是客戶端發送的每次請求都需要服務器回送響應,在請求結束后,會主動釋放連接。從建立連接到關閉連接的過程稱為“一次連接”。

四、TCP和UDP的區別(考得最多。。快被考爛了我覺得- -\\)

1、TCP是面向鏈接的,雖然說網絡的不安全不穩定特性決定了多少次握手都不能保證連接的可靠性,但TCP的三次握手在最低限度上(實際上也很大程度上保證了)保證了連接的可靠性;

而UDP不是面向連接的,UDP傳送數據前并不與對方建立連接,對接收到的數據也不發送確認信號,發送端不知道數據是否會正確接收,當然也不用重發,所以說UDP是無連接的、不可靠的一種數據傳輸協議。

2、也正由于1所說的特點,使得UDP的開銷更小數據傳輸速率更高,因為不必進行收發數據的確認,所以UDP的實時性更好。

知道了TCP和UDP的區別,就不難理解為何采用TCP傳輸協議的MSN比采用UDP的QQ傳輸文件慢了,但并不能說QQ的通信是不安全的,

因為程序員可以手動對UDP的數據收發進行驗證,比如發送方對每個數據包進行編號然后由接收方進行驗證啊什么的,

即使是這樣,UDP因為在底層協議的封裝上沒有采用類似TCP的“三次握手”而實現了TCP所無法達到的傳輸效率。

1、TCP連接

要想明白Socket連接,先要明白TCP連接。手機能夠使用聯網功能是因為手機底層實現了TCP/IP協議,可以使手機終端通過無線網絡建立TCP連接。TCP協議可以對上層網絡提供接口,使上層網絡數據的傳輸建立在“無差別”的網絡之上。

建立起一個TCP連接需要經過“三次握手”:

第一次握手:客戶端發送syn包(syn=j)到服務器,并進入SYN_SEND狀態,等待服務器確認;

第二次握手:服務器收到syn包,必須確認客戶的SYN(ack=j+1),同時自己也發送一個SYN包(syn=k),即SYN+ACK包,此時服務器進入SYN_RECV狀態;

第三次握手:客戶端收到服務器的SYN+ACK包,向服務器發送確認包ACK(ack=k+1),此包發送完畢,客戶端和服務器進入ESTABLISHED狀態,完成三次握手。

握手過程中傳送的包里不包含數據,三次握手完畢后,客戶端與服務器才正式開始傳送數據。理想狀態下,TCP連接一旦建立,在通信雙方中的任何一方主動關閉連接之前,TCP 連接都將被一直保持下去。斷開連接時服務器和客戶端均可以主動發起斷開TCP連接的請求,斷開過程需要經過“四次握手”(過程就不細寫了,就是服務器和客戶端交互,最終確定斷開)


2、HTTP連接

HTTP協議即超文本傳送協議(Hypertext Transfer Protocol ),是Web聯網的基礎,也是手機聯網常用的協議之一,HTTP協議是建立在TCP協議之上的一種應用。

HTTP連接最顯著的特點是客戶端發送的每次請求都需要服務器回送響應,在請求結束后,會主動釋放連接。從建立連接到關閉連接的過程稱為“一次連接”。

1)在HTTP 1.0中,客戶端的每次請求都要求建立一次單獨的連接,在處理完本次請求后,就自動釋放連接。?
2)在HTTP 1.1中則可以在一次連接中處理多個請求,并且多個請求可以重疊進行,不需要等待一個請求結束后再發送下一個請求。?


3、SOCKET原理

3.1套接字(socket)概念

套接字(socket)是通信的基石,是支持TCP/IP協議的網絡通信的基本操作單元。它是網絡通信過程中端點的抽象表示,包含進行網絡通信必須的五種信息:連接使用的協議,本地主機的IP地址,本地進程的協議端口,遠地主機的IP地址,遠地進程的協議端口。

應用層通過傳輸層進行數據通信時,TCP會遇到同時為多個應用程序進程提供并發服務的問題。多個TCP連接或多個應用程序進程可能需要通過同一個 TCP協議端口傳輸數據。為了區別不同的應用程序進程和連接,許多計算機操作系統為應用程序與TCP/IP協議交互提供了套接字(Socket)接口。應用層可以和傳輸層通過Socket接口,區分來自不同應用程序進程或網絡連接的通信,實現數據傳輸的并發服務。


3.2 建立socket連接?
建立Socket連接至少需要一對套接字,其中一個運行于客戶端,稱為ClientSocket ,另一個運行于服務器端,稱為ServerSocket 。

套接字之間的連接過程分為三個步驟:服務器監聽,客戶端請求,連接確認。

服務器監聽:服務器端套接字并不定位具體的客戶端套接字,而是處于等待連接的狀態,實時監控網絡狀態,等待客戶端的連接請求。

客戶端請求:指客戶端的套接字提出連接請求,要連接的目標是服務器端的套接字。為此,客戶端的套接字必須首先描述它要連接的服務器的套接字,指出服務器端套接字的地址和端口號,然后就向服務器端套接字提出連接請求。

連接確認:當服務器端套接字監聽到或者說接收到客戶端套接字的連接請求時,就響應客戶端套接字的請求,建立一個新的線程,把服務器端套接字的描述發給客戶端,一旦客戶端確認了此描述,雙方就正式建立連接。而服務器端套接字繼續處于監聽狀態,繼續接收其他客戶端套接字的連接請求。


4、SOCKET連接與TCP連接

創建Socket連接時,可以指定使用的傳輸層協議,Socket可以支持不同的傳輸層協議(TCP或UDP),當使用TCP協議進行連接時,該Socket連接就是一個TCP連接。


5、Socket連接與HTTP連接

由于通常情況下Socket連接就是TCP連接,因此Socket連接一旦建立,通信雙方即可開始相互發送數據內容,直到雙方連接斷開。但在實際網絡應用中,客戶端到服務器之間的通信往往需要穿越多個中間節點,例如路由器、網關、防火墻等,大部分防火墻默認會關閉長時間處于非活躍狀態的連接而導致 Socket 連接斷連,因此需要通過輪詢告訴網絡,該連接處于活躍狀態。

而HTTP連接使用的是“請求—響應”的方式,不僅在請求時需要先建立連接,而且需要客戶端向服務器發出請求后,服務器端才能回復數據。

很多情況下,需要服務器端主動向客戶端推送數據,保持客戶端與服務器數據的實時與同步。此時若雙方建立的是Socket連接,服務器就可以直接將數據傳送給客戶端;若雙方建立的是HTTP連接,則服務器需要等到客戶端發送一次請求后才能將數據傳回給客戶端,因此,客戶端定時向服務器端發送連接請求,不僅可以保持在線,同時也是在“詢問”服務器是否有新的數據,如果有就將數據傳給客戶端。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/247881.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/247881.shtml
英文地址,請注明出處:http://en.pswp.cn/news/247881.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

LED音樂頻譜之點陣

轉載請注明出處:http://blog.csdn.net/ruoyunliufeng/article/details/37967455 一.硬件 這里的LED選擇直插的霧面LED,亮度可以還不失美觀。注意每行要加上限流電阻。74HC138(三八譯碼器)作為列選,每行都連著74HC595&a…

上架相關——App Store 上架流程

說實話,公司要上架一個自己做的一個小項目。為了完成這個任務,菜鳥的我一遍找資料一遍跟著做,一遍修改錯誤一遍查找解決方案。網上的資料大部分都是2015年以前的資料,資料有點不夠過時,而且步驟配圖也不是很詳細&#…

this.$router 的三種跳轉頁面方法

第一種: this.$router.push(需要跳轉到的路徑名稱)此方法跳轉后,會在歷史欄目中保存路勁地址,當點擊歷史標簽時可以進行訪問 第二種: this.$router.replace(需要跳轉到的路徑名稱)此方法跳轉后,會在歷史欄目中不保存…

cf777c

題意:給你一個n*m的數陣 對于一行到另一行,若存在一列從上到下遞減,則稱之符合題意 The first line of the input contains two positive integers n and m (1?≤?nm?≤?100?000) — the number of rows and the number of columns in t…

上架相關——appstore 更新app版本

注:此片文章是基于app已經上架,也就是證書都已經配置好的前提下。 首先是還是app打包 修改版本號 修改project處的pp文件 檢查無誤后打包打包完成后upload to app store 漫長的等待。。 上傳到appstore進入iTunesConnect 選擇我的app 選擇對應app點…

輸入框輸入數字,且不能有小數點存在

基于Vue項目進行設置 <template><comp v-if"update"></comp><button click"reload()">刷新comp組件</button></template><script>import comp from /views/comp.vueexport default {name: parentComp,data() {r…

iOS開發 藍牙技術4.0詳解

前言 前端時間,同學在做項目過程中遇到關于藍牙方面的問題,今天我就給大家進行詳細的進行講解下藍牙在iOS開發中的具體實現.在介紹藍牙前,大家要搞清楚什么是藍牙? 什么是藍牙? 隨著藍牙低功耗技術BLE&#xff08;Bluetooth Low Energy&#xff09;的發展&#xff0c;藍牙技術…

前端面試題(五)

position的屬性有哪些&#xff1f; 1、absolute生成絕對定位的元素&#xff0c;相對于值不為 static的第一個父元素進行定位。 2、fixed &#xff08;老IE不支持&#xff09;生成絕對定位的元素&#xff0c;相對于瀏覽器窗口進行定位。 3、relative生成相對定位的元素&#xff…

qrcode.js 二維碼生成器

二維碼生成 并顯示&#xff1a; <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns"http://www.w3.org/1999/xhtml" xml:lang"ko" …

SQL -- 多表查詢

-- --SQL基礎-->多表查詢 -- /* 一、多表查詢 簡言之&#xff0c;根據特定的連接條件從不同的表中獲取所需的數據 笛卡爾集的產生條件&#xff1a; 省略連接條件 連接條件無效 第一個表中的所有行與第二個表中的所有行相連接 二、多表查詢語法&#xff1a;*/ SELECT tab…

如何解決兩個相鄰的span中間有空隙

span中間不要有換行、或者空格 或者在樣式上加上float&#xff1a;left轉載于:https://www.cnblogs.com/lst619247/p/10944341.html

Vue項目中Table設置 render 函數

statusList1: {0: "",1: "",2: "藥品服務費收入",3: "特藥服務費收入",4: "直保經紀費",5: "再保經紀費",6: "廣告費",},render: (h, params) > {return this.colorCommon(h, params.row, "1&q…

AVPlayer設置從哪兒開始播放

avplayer 播放視頻 首先介紹幾個方法吧和屬性吧。 - (id)addPeriodicTimeObserverForInterval:(CMTime)interval queue:(dispatch_queue_t)queue usingBlock:(void (^)(CMTime time))block 這個方法可以用于跟新進度條。 - (void)seekToTime:(CMTime)time completionHandler:(v…

老男孩爬蟲實戰密訓課第一季,2018.6,初識爬蟲訓練-實戰1-爬取汽車之家新聞數據...

1.爬蟲介紹 編寫程序&#xff0c;根據URL獲取網站信息 2.用到的庫 requests庫 bs4庫 3.內容及步驟 4.代碼 import requests import os from bs4 import BeautifulSoup # 1.下載頁面 ret requests.get(urlhttps://www.autohome.com.cn/news/) ret.encoding ret.apparent_encod…

Table 表格導出功能

<Card class"clearfix"><p slot"title"><Icon type"ios-list"></Icon>收入信息</p><!-- 導出1 --><div class"daochu1"><!-- 導出按鈕 --><div class"search"><B…

iOS開發 簡單實現視頻音頻的邊下邊播

直接切入主題&#xff0c;要實現的功能是&#xff1a;1、ios視頻音頻邊緩存邊播放&#xff0c;緩存時可以在已下載的部分拖拽進度條。2、緩存到一半退出&#xff0c;再次播放同一地址的視頻時&#xff0c;視頻繼續下載&#xff0c;并且緩存進度已經走到上一次下載的位置。3、無…

volatile的原理和實現機制

volatile到底如何保證可見性和禁止指令重排序的。 “觀察加入volatile關鍵字和沒有加入volatile關鍵字時所生成的匯編代碼發現&#xff0c;加入volatile關鍵字時&#xff0c;會多出一個lock前綴指令” lock前綴指令實際上相當于一個內存屏障&#xff08;也成內存柵欄&#xff0…

Table城市代碼翻譯

// data 數據變量 eara&#xff1a;[]// 接口調用 getChinaList() {return fetch({url: "/api/v1/china/city/search",method: "GET"});},// table 欄中的 render 函數 render: (h, params) > {return h("span",this.dictCodesCommon(params.…

iOS中的WiFi與硬件通信

WiFi通信是指手機通過WiFi與外部設備建立連接&#xff0c;并與外部設備進行交互、通信。手機與外部設備的WiFi通信通常是使用Socket來實現的&#xff0c;在這里先介紹一個第三方Socket庫&#xff08;CocoaAsyncSocket&#xff09;來實現WiFi通信。 CocoaAsyncSocket支持TCP和U…

MongoDB查詢報錯:class com.mongodb.MongoSecurityException: Exception authenticating MongoCredential...

異常日志&#xff1a; 2019-05-30 10:10:24,252 [http-nio-8080-exec-1] DEBUG [java.sql.Connection] - ooo Connection Opened 2019-05-30 10:10:24,258 [http-nio-8080-exec-1] DEBUG [java.sql.PreparedStatement] - > Executing: insert into client_config ( appid, …