iOS網(wǎng)絡(luò)HTTP、TCP震捣、UDP荔棉、Socket 知識總結(jié)
OSI 七層模型
我們一般使用的網(wǎng)絡(luò)數(shù)據(jù)傳輸由下而上共有七層,分別為物理層、數(shù)據(jù)鏈路層蒿赢、網(wǎng)絡(luò)層润樱、傳輸層、會話層羡棵、表示層壹若、應(yīng)用層,也被依次稱為 OSI 第一層、第二層、??舌稀、 第七層啊犬。
各層功能簡介
1.物理層(Physical Layer)
物理層位于 OSI 參考模型的最低層,它直接面向原始比特流的傳輸。為了實(shí)現(xiàn)原始比特流的物理傳輸,物理層必須解決好包括傳輸介質(zhì)壁查、信道類型觉至、數(shù)據(jù)與信號之間的轉(zhuǎn)換、信號傳輸中的衰減和噪聲等在內(nèi)的一系列問題睡腿。另外,物理層標(biāo)準(zhǔn)要給出關(guān)于物理接口的機(jī)械语御、 電氣、功能和規(guī)程特性,以便于不同的制造廠家既能夠根據(jù)公認(rèn)的標(biāo)準(zhǔn)各自獨(dú)立地制造設(shè)備,又能使各個(gè)廠家的產(chǎn)品能夠相互兼容席怪。
2.數(shù)據(jù)鏈路層(Data Link Layer)
在物理層發(fā)送和接收數(shù)據(jù)的過程中,會出現(xiàn)一些物理層自己不能解決的問題应闯。例如, 當(dāng)兩個(gè)節(jié)點(diǎn)同時(shí)試圖在一條線路上發(fā)送數(shù)據(jù)時(shí)該如何處理?節(jié)點(diǎn)如何知道它所接收的數(shù)據(jù) 是否正確?如果噪聲改變了一個(gè)分組的目標(biāo)地址,節(jié)點(diǎn)如何察覺它丟失了本應(yīng)收到的分組呢?這些都是數(shù)據(jù)鏈路層所必須負(fù)責(zé)的工作。
數(shù)據(jù)鏈路層涉及相鄰節(jié)點(diǎn)之間的可靠數(shù)據(jù)傳輸,數(shù)據(jù)鏈路層通過加強(qiáng)物理層傳輸原始比特的功能,使之對網(wǎng)絡(luò)層表現(xiàn)為一條無錯(cuò)線路挂捻。為了能夠?qū)崿F(xiàn)相鄰節(jié)點(diǎn)之間無差錯(cuò)的數(shù)據(jù)傳送,數(shù)據(jù)鏈路層在數(shù)據(jù)傳輸過程中提供了確認(rèn)碉纺、差錯(cuò)控制和流量控制等機(jī)制。
3.網(wǎng)絡(luò)層(Network Layer)
網(wǎng)絡(luò)中的兩臺計(jì)算機(jī)進(jìn)行通信時(shí),中間可能要經(jīng)過許多中間結(jié)點(diǎn)甚至不同的通信子網(wǎng)刻撒。 網(wǎng)絡(luò)層的任務(wù)就是在通信子網(wǎng)中選擇一條合適的路徑,使發(fā)送端傳輸層所傳下來的數(shù)據(jù)能 夠通過所選擇的路徑到達(dá)目的端骨田。
為了實(shí)現(xiàn)路徑選擇,網(wǎng)絡(luò)層必須使用尋址方案來確定存在哪些網(wǎng)絡(luò)以及設(shè)備在這些網(wǎng)絡(luò)中所處的位置,不同網(wǎng)絡(luò)層協(xié)議所采用的尋址方案是不同的。在確定了目標(biāo)結(jié)點(diǎn)的位置后, 網(wǎng)絡(luò)層還要負(fù)責(zé)引導(dǎo)數(shù)據(jù)包正確地通過網(wǎng)絡(luò),找到通過網(wǎng)絡(luò)的最優(yōu)路徑,即路由選擇声怔。如果子網(wǎng)中同時(shí)出現(xiàn)過多的分組,它們將相互阻塞通路并可能形成網(wǎng)絡(luò)瓶頸,所以網(wǎng)絡(luò)層還需要提供擁塞控制機(jī)制以避免此類現(xiàn)象的出現(xiàn)态贤。另外,網(wǎng)絡(luò)層還要解決異構(gòu)網(wǎng)絡(luò)互連問題。
4.傳輸層(Transport Layer)
傳輸層是 OSI 七層模型中唯一負(fù)責(zé)端到端節(jié)點(diǎn)間數(shù)據(jù)傳輸和控制功能的層醋火。傳輸層是 OSI 七層模型中承上啟下的層,它下面的三層主要面向網(wǎng)絡(luò)通信,以確保信息被準(zhǔn)確有效地傳輸;它上面的三個(gè)層次則面向用戶主機(jī),為用戶提供各種服務(wù)悠汽。
傳輸層通過彌補(bǔ)網(wǎng)絡(luò)層服務(wù)質(zhì)量的不足,為會話層提供端到端的可靠數(shù)據(jù)傳輸服務(wù)。它為會話層屏蔽了傳輸層以下的數(shù)據(jù)通信的細(xì)節(jié),使會話層不會受到下三層技術(shù)變化的影響芥驳。但同時(shí),它又依靠下面的三個(gè)層次控制實(shí)際的網(wǎng)絡(luò)通信操作,來完成數(shù)據(jù)從源到目標(biāo)的傳輸柿冲。傳輸層為了向會話層提供可靠的端到端傳輸服務(wù),也使用了差錯(cuò)控制和流量控制等機(jī)制。
5.會話層(Session Layer)
會話層的功能是在兩個(gè)節(jié)點(diǎn)間建立兆旬、維護(hù)和釋放面向用戶的連接姻采。它是在傳輸連接的基礎(chǔ)上建立會話連接,并進(jìn)行數(shù)據(jù)交換管理,允許數(shù)據(jù)進(jìn)行單工、半雙工和全雙工的傳送爵憎。會話層提供了令牌管理和同步兩種服務(wù)功能慨亲。
6.表示層(Presentation Layer)
表示層以下的各層只關(guān)心可靠的數(shù)據(jù)傳輸,而表示層關(guān)心的是所傳輸數(shù)據(jù)的語法和語義。它主要涉及處理在兩個(gè)通信系統(tǒng)之間所交換信息的表示方式,包括數(shù)據(jù)格式變換宝鼓、數(shù)據(jù)加密與解密刑棵、數(shù)據(jù)壓縮與恢復(fù)等功能。
7.應(yīng)用層(Application Layer)
應(yīng)用層是 OSI 參考模型的最高層,負(fù)責(zé)為用戶的應(yīng)用程序提供網(wǎng)絡(luò)服務(wù)愚铡。與 OSI 其他層不同的是,它不為任何其他 OSI 層提供服務(wù),而只是為 OSI 模型以外的應(yīng)用程序提供服務(wù)蛉签。包括為相互通信的應(yīng)用程序或進(jìn)行之間建立連接胡陪、進(jìn)行同步,建立關(guān)于錯(cuò)誤糾正和控 制數(shù)據(jù)完整性過程的協(xié)商等。應(yīng)用層還包含大量的應(yīng)用協(xié)議,如分布式數(shù)據(jù)庫的訪問碍舍、文件的交換柠座、電子郵件、虛擬終端等片橡。
其中物理層妈经、數(shù)據(jù)鏈路層和網(wǎng)絡(luò)層通常被稱作媒體層,是網(wǎng)絡(luò)工程師所研究的對象捧书;
傳輸層吹泡、會話層、表示層和應(yīng)用層則被稱作主機(jī)層经瓷,是用戶所面向和關(guān)心的內(nèi)容爆哑。
http協(xié)議 對應(yīng)于應(yīng)用層
tcp協(xié)議 對應(yīng)于傳輸層
ip協(xié)議 對應(yīng)于網(wǎng)絡(luò)層
三者本質(zhì)上沒有可比性。 何況HTTP協(xié)議是基于TCP連接的舆吮。
TCP/IP是傳輸層協(xié)議揭朝,主要解決數(shù)據(jù)如何在網(wǎng)絡(luò)中傳輸;而HTTP是應(yīng)用層協(xié)議色冀,主要解決如何包裝數(shù)據(jù)潭袱。
我們在傳輸數(shù)據(jù)時(shí),可以只使用傳輸層(TCP/IP)呐伞,但是那樣的話敌卓,由于沒有應(yīng)用層慎式,便無法識別數(shù)據(jù)內(nèi)容伶氢,如果想要使傳輸?shù)臄?shù)據(jù)有意義,則必須使用應(yīng)用層協(xié)議瘪吏,應(yīng)用層協(xié)議很多癣防,有HTTP、FTP掌眠、TELNET等等蕾盯,也可以自己定義應(yīng)用層協(xié)議。WEB使用HTTP作傳輸層協(xié)議蓝丙,以封裝HTTP文本信息级遭,然后使用 TCP/IP 做傳輸層協(xié)議將它發(fā)送到網(wǎng)絡(luò)上。Socket是對 TCP/IP 協(xié)議的封裝渺尘,Socket 本身并不是協(xié)議挫鸽,而是一個(gè)調(diào)用接口(API),通過Socket鸥跟,我們才能使用TCP/IP 協(xié)議丢郊。
TCP/IP 模型
TCP/IP 模型是由美國國防部創(chuàng)建的,所以有時(shí)又稱 DoD(Department of Defense)模型盔沫。 TCP/IP 模型分為四層,由下而上分別為網(wǎng)絡(luò)訪問層、網(wǎng)際層枫匾、傳輸層架诞、應(yīng)用層,如圖所示。
應(yīng)該指出,TCP/IP 是 OSI 模型之前的產(chǎn)物,所以兩者間不存在嚴(yán)格的層對應(yīng)關(guān)系干茉。 在 TCP/IP 模型中并不存在與 OSI 中的物理層與數(shù)據(jù)鏈路層相對應(yīng)的部分,相反,由于 TCP/IP 的主要目標(biāo)是致力于異構(gòu)網(wǎng)絡(luò)的互連,所以在 OSI 中的物理層與數(shù)據(jù)鏈路層相對應(yīng)的部分沒有作任何限定谴忧。
在 TCP/IP 模型中,網(wǎng)絡(luò)訪問層是 TCP/IP 模型的最低層,負(fù)責(zé)接收從網(wǎng)際層交來的 IP 數(shù)據(jù)報(bào)并將 IP 數(shù)據(jù)報(bào)通過底層物理網(wǎng)絡(luò)發(fā)送出去,或者從底層物理網(wǎng)絡(luò)上接收物理幀,抽出 IP 數(shù)據(jù)報(bào),交給互聯(lián)網(wǎng)層。網(wǎng)絡(luò)訪問層使采用不同技術(shù)和網(wǎng)絡(luò)硬件的網(wǎng)絡(luò)之間能夠互聯(lián), 它包括屬于操作系統(tǒng)的設(shè)備驅(qū)動(dòng)器和計(jì)算機(jī)網(wǎng)絡(luò)接口卡,以處理具體的硬件物理接口等脂。
網(wǎng)際層負(fù)責(zé)獨(dú)立地將分組從源主機(jī)送往目標(biāo)主機(jī),涉及為分組提供最佳路徑的選擇和 交換功能,并使這一過程與它們所經(jīng)過的路徑和網(wǎng)絡(luò)無關(guān)俏蛮。這好比你寄信時(shí),你并不需要知道它是如何到達(dá)目的地的,而只關(guān)心它是否到達(dá)了。TCP/IP 模型的互聯(lián)網(wǎng)層在功能上非常類似于 OSI 參考模型中的網(wǎng)絡(luò)層上遥。
傳輸層的作用與 OSI 參考模型中傳輸層的作用是類似的,即在源結(jié)點(diǎn)和目的結(jié)點(diǎn)的兩個(gè)對等實(shí)體間提供可靠的端到端的數(shù)據(jù)通信搏屑。為保證數(shù)據(jù)傳輸?shù)目煽啃?傳輸層協(xié)議也提供了確認(rèn)、差錯(cuò)控制和流量控制等機(jī)制粉楚。另外,由在一般的計(jì)算機(jī)中,常常是多個(gè)應(yīng)用程序同時(shí)訪問網(wǎng)絡(luò),所以傳輸層還要提供不同應(yīng)用程序的標(biāo)識辣恋。
應(yīng)用層涉及為用戶提供網(wǎng)絡(luò)應(yīng)用,并為這些應(yīng)用提供網(wǎng)絡(luò)支撐服務(wù)。由于 TCP/IP 將所有與應(yīng)用相關(guān)的內(nèi)容都有歸為一層,所以在應(yīng)用層要處理高層協(xié)議模软、數(shù)據(jù)表達(dá)和對話控制等任務(wù)伟骨。
OSI 模型和 TCP/IP 模型的區(qū)別
OSI 模型包括了七層,而 TCP/IP 模型只有四層。雖然它們具有功能相當(dāng)?shù)木W(wǎng)絡(luò)層燃异、傳輸層和應(yīng)用層,但其它層并不相同携狭。
TCP/IP 模型中沒有專門的表示層和會話層,它將與這兩層相關(guān)的表達(dá)、編碼和會話控制等功能包含到了應(yīng)用層中去完成回俐。另外,TCP/IP 模型還將 OSI 的數(shù)據(jù)鏈路層和物理層包括到了一個(gè)網(wǎng)絡(luò)訪問層中逛腿。
OSI 模型在網(wǎng)絡(luò)層支持無連接和面向連接的兩種服務(wù),而在傳輸層僅支持面向連接的服 務(wù)。TCP/IP 模型在互聯(lián)網(wǎng)層則只支持無連接的一種服務(wù),但在傳輸層支持面向連接和無連 接兩種服務(wù)仅颇。
TCP/IP 由于有較少的層次,因而顯得更簡單,并且作為從因特網(wǎng)(INTERNET)上發(fā)展起來的協(xié)議,已經(jīng)成了網(wǎng)絡(luò)互連的事實(shí)標(biāo)準(zhǔn)单默。但是,目前還沒有實(shí)際網(wǎng)絡(luò)是建立在 OSI 七層模型基礎(chǔ)上的,OSI 僅僅作為理論的參考模型被廣泛使用。
Http和Socket連接區(qū)別
短連接
連接->傳輸數(shù)據(jù)->關(guān)閉連接
HTTP是無狀態(tài)的忘瓦,瀏覽器和服務(wù)器每進(jìn)行一次HTTP操作搁廓,就建立一次連接,但任務(wù)結(jié)束就中斷連接耕皮。
也可以這樣說:短連接是指 Socket 連接后發(fā)送后接收完數(shù)據(jù)后馬上斷開連接境蜕。
長連接
連接->傳輸數(shù)據(jù)->保持連接 -> 傳輸數(shù)據(jù)-> 。凌停。粱年。 ->關(guān)閉連接。
長連接指建立 Socket 連接后不管是否使用都保持連接苦锨,但安全性較差逼泣。
http的長連接
HTTP也可以建立長連接的趴泌,使用Connection:keep-alive,HTTP 1.1默認(rèn)進(jìn)行持久連接拉庶。HTTP1.1和HTTP1.0相比較而言嗜憔,最大的區(qū)別就是增加了持久連接支持(貌似最新的 http1.0 可以顯示的指定 keep-alive),但還是無狀態(tài)的,或者說是不可以信任的。
什么時(shí)候用長連接,短連接停士?
長連接多用于操作頻繁领曼,點(diǎn)對點(diǎn)的通訊泻骤,而且連接數(shù)不能太多情況,。每個(gè)TCP連接都需要三步握手,這需要時(shí)間珊拼,如果每個(gè)操作都是先連接,再操作的話那么處理 速度會降低很多流炕,所以每個(gè)操作完后都不斷開澎现,次處理時(shí)直接發(fā)送數(shù)據(jù)包就OK了,不用建立TCP連接每辟。例如:數(shù)據(jù)庫的連接用長連接剑辫, 如果用短連接頻繁的通信會造成 Socket 錯(cuò)誤,而且頻繁的 Socket 創(chuàng)建也是對資源的浪費(fèi)渠欺。
而像WEB網(wǎng)站的http服務(wù)一般都用短鏈接妹蔽,因?yàn)殚L連接對于服務(wù)端來說會耗費(fèi)一定的資源,而像WEB網(wǎng)站這么頻繁的成千上萬甚至上億客戶端的連接用短連接 會更省一些資源挠将,如果用長連接胳岂,而且同時(shí)有成千上萬的用戶,如果每個(gè)用戶都占用一個(gè)連接的話捐名,那可想而知吧旦万。所以并發(fā)量大闹击,但每個(gè)用戶無需頻繁操作情況下 需用短連好镶蹋。
總之,長連接和短連接的選擇要視情況而定赏半。
1贺归、http連接
HTTP協(xié)議即超文本傳送協(xié)議(HypertextTransfer Protocol ),是Web聯(lián)網(wǎng)的基礎(chǔ)断箫,也是手機(jī)聯(lián)網(wǎng)常用的協(xié)議之一拂酣,HTTP協(xié)議是建立在TCP協(xié)議之上的一種應(yīng)用。
HTTP連接最顯著的特點(diǎn)是客戶端發(fā)送的每次請求都需要服務(wù)器回送響應(yīng)仲义,在請求結(jié)束后婶熬,會主動(dòng)釋放連接剑勾。從建立連接到關(guān)閉連接的過程稱為“一次連接”。
1)在HTTP 1.0中赵颅,客戶端的每次請求都要求建立一次單獨(dú)的連接虽另,在處理完本次請求后,就自動(dòng)釋放連接饺谬。
2)在HTTP 1.1中則可以在一次連接中處理多個(gè)請求捂刺,并且多個(gè)請求可以重疊進(jìn)行,不需要等待一個(gè)請求結(jié)束后再發(fā)送下一個(gè)請求募寨。
由于HTTP在每次請求結(jié)束后都會主動(dòng)釋放連接族展,因此HTTP連接是一種“短連接”,要保持客戶端程序的在線狀態(tài)拔鹰,需要不斷地向服務(wù)器發(fā)起連接請求仪缸。通常的 做法是即時(shí)不需要獲得任何數(shù)據(jù),客戶端也保持每隔一段固定的時(shí)間向服務(wù)器發(fā)送一次“保持連接”的請求列肢,服務(wù)器在收到該請求后對客戶端進(jìn)行回復(fù)腹殿,表明知道客 戶端“在線”。若服務(wù)器長時(shí)間無法收到客戶端的請求例书,則認(rèn)為客戶端“下線”锣尉,若客戶端長時(shí)間無法收到服務(wù)器的回復(fù),則認(rèn)為網(wǎng)絡(luò)已經(jīng)斷開决采。
2自沧、Socket
Socket 是應(yīng)用層與TCP/IP協(xié)議族通信的中間軟件抽象層,它是一組接口树瞭。首先讓我們通過一張圖知道Socket在哪里拇厢?
a、套接字(Socket)概念
套接字(Socket)是通信的基石晒喷,是支持TCP/IP協(xié)議的網(wǎng)絡(luò)通信的基本操作單元孝偎。它是網(wǎng)絡(luò)通信過程中端點(diǎn)的抽象表示,包含進(jìn)行網(wǎng)絡(luò)通信必須的五種信息:連接使用的協(xié)議凉敲,本地主機(jī)的IP地址衣盾,本地進(jìn)程的協(xié)議端口,遠(yuǎn)地主機(jī)的IP地址爷抓,遠(yuǎn)地進(jìn)程的協(xié)議端口势决。
應(yīng)用層通過傳輸層進(jìn)行數(shù)據(jù)通信時(shí),TCP會遇到同時(shí)為多個(gè)應(yīng)用程序進(jìn)程提供并發(fā)服務(wù)的問題蓝撇。多個(gè)TCP連接或多個(gè)應(yīng)用程序進(jìn)程可能需要通過同一個(gè) TCP協(xié)議端口傳輸數(shù)據(jù)果复。為了區(qū)別不同的應(yīng)用程序進(jìn)程和連接,許多計(jì)算機(jī)操作系統(tǒng)為應(yīng)用程序與TCP/IP協(xié)議交互提供了套接字(Socket)接口渤昌。應(yīng)用層可以和傳輸層通過Socket接口虽抄,區(qū)分來自不同應(yīng)用程序進(jìn)程或網(wǎng)絡(luò)連接的通信走搁,實(shí)現(xiàn)數(shù)據(jù)傳輸?shù)牟l(fā)服務(wù)。
b 迈窟、建立Socket連接
建立 Socket 連接至少需要一對套接字朱盐,其中一個(gè)運(yùn)行于客戶端,稱為ClientSocket菠隆,另一個(gè)運(yùn)行于服務(wù)器端兵琳,稱為ServerSocket。
套接字之間的連接過程分為三個(gè)步驟:服務(wù)器監(jiān)聽骇径,客戶端請求躯肌,連接確認(rèn)。
服務(wù)器監(jiān)聽:服務(wù)器端套接字并不定位具體的客戶端套接字破衔,而是處于等待連接的狀態(tài)清女,實(shí)時(shí)監(jiān)控網(wǎng)絡(luò)狀態(tài),等待客戶端的連接請求晰筛。
客戶端請求:指客戶端的套接字提出連接請求嫡丙,要連接的目標(biāo)是服務(wù)器端的套接字。為此读第,客戶端的套接字必須首先描述它要連接的服務(wù)器的套接字曙博,指出服務(wù)器端套接字的地址和端口號,然后就向服務(wù)器端套接字提出連接請求怜瞒。
連接確認(rèn):當(dāng)服務(wù)器端套接字監(jiān)聽到或者說接收到客戶端套接字的連接請求時(shí)父泳,就響應(yīng)客戶端套接字的請求,建立一個(gè)新的線程吴汪,把服務(wù)器端套接字的描述發(fā)給客戶端惠窄,一旦客戶端確認(rèn)了此描述,雙方就正式建立連接漾橙。而服務(wù)器端套接字繼續(xù)處于監(jiān)聽狀態(tài)杆融,繼續(xù)接收其他客戶端套接字的連接請求。
c霜运、Socket連接與TCP連接
創(chuàng)建Socket連接時(shí)脾歇,可以指定使用的傳輸層協(xié)議,Socket可以支持不同的傳輸層協(xié)議(TCP或UDP)觉渴,當(dāng)使用TCP協(xié)議進(jìn)行連接時(shí)介劫,該Socket連接就是一個(gè)TCP連接徽惋。
d案淋、Socket連接與HTTP連接
由于通常情況下 Socket 連接就是TCP連接,因此 Socket 連接一旦建立险绘,通信雙方即可開始相互發(fā)送數(shù)據(jù)內(nèi)容踢京,直到雙方連接斷開誉碴。但在實(shí)際網(wǎng)絡(luò)應(yīng)用中,客戶端到服務(wù)器之間的通信往往需要穿越多個(gè)中間節(jié)點(diǎn)瓣距,例如路由器黔帕、網(wǎng)關(guān)、防火墻等蹈丸,大部分防火墻默認(rèn)會關(guān)閉長時(shí)間處于非活躍狀態(tài)的連接而導(dǎo)致 Socket 連接斷連成黄,因此需要通過輪詢告訴網(wǎng)絡(luò),該連接處于活躍狀態(tài)逻杖。
而HTTP連接使用的是“請求—響應(yīng)”的方式奋岁,不僅在請求時(shí)需要先建立連接,而且需要客戶端向服務(wù)器發(fā)出請求后荸百,服務(wù)器端才能回復(fù)數(shù)據(jù)闻伶。
很多情況下,需要服務(wù)器端主動(dòng)向客戶端推送數(shù)據(jù)够话,保持客戶端與服務(wù)器數(shù)據(jù)的實(shí)時(shí)與同步蓝翰。此時(shí)若雙方建立的是Socket連接,服務(wù)器就可以直接將數(shù)據(jù)傳送給 客戶端女嘲;若雙方建立的是HTTP連接畜份,則服務(wù)器需要等到客戶端發(fā)送一次請求后才能將數(shù)據(jù)傳回給客戶端,因此欣尼,客戶端定時(shí)向服務(wù)器端發(fā)送連接請求漂坏,不僅可以保持在線,同時(shí)也是在“詢問”服務(wù)器是否有新的數(shù)據(jù)媒至,如果有就將數(shù)據(jù)傳給客戶端顶别。
tcp和udp的區(qū)別
TCP是面向連接的、傳輸可靠(保證數(shù)據(jù)正確性且保證數(shù)據(jù)順序)拒啰、用于傳輸大量數(shù)據(jù)(流模式)驯绎、速度慢,建立連接需要開銷較多(時(shí)間谋旦,系統(tǒng)資源)剩失。
TCP是一種流模式的協(xié)議,是面向連接的册着,也就是說拴孤,在連接持續(xù)的過程中,Socket 中收到的數(shù)據(jù)都是由同一臺主機(jī)發(fā)出的(劫持什么的不考慮)甲捏,因此演熟,知道保證數(shù)據(jù)是有序的到達(dá)就行了,至于每次讀取多少數(shù)據(jù)不關(guān)心。
TCP:面向連接芒粹、傳輸可靠(保證數(shù)據(jù)正確性,保證數(shù)據(jù)順序)兄纺、用于傳輸大量數(shù)據(jù)(流模式)、速度慢化漆,建立連接需要開銷較多(時(shí)間估脆,系統(tǒng)資源)。
UDP:面向非連接座云、傳輸不可靠疙赠、用于傳輸少量數(shù)據(jù)(數(shù)據(jù)包模式)、速度快朦拖。
關(guān)于TCP是一種流模式的協(xié)議棺聊,UDP是一種數(shù)據(jù)報(bào)模式的協(xié)議,這里要說明一下贞谓,TCP是面向連接的限佩,也就是說,在連接持續(xù)的過程中裸弦,socket 中收到的數(shù)據(jù)都是由同一臺主機(jī)發(fā)出的(劫持什么的不考慮)祟同,因此,知道保證數(shù)據(jù)是有序的到達(dá)就行了理疙,至于每次讀取多少數(shù)據(jù)自己看著辦晕城。
而UDP是無連接的協(xié)議,也就是說窖贤,只要知道接收端的IP和端口砖顷,且網(wǎng)絡(luò)是可達(dá)的,任何主機(jī)都可以向接收端發(fā)送數(shù)據(jù)赃梧。這時(shí)候滤蝠,如果一次能讀取超過一個(gè)報(bào)文的數(shù)據(jù),則會亂套授嘀。比如物咳,主機(jī)A向發(fā)送了報(bào)文P1,主機(jī)B發(fā)送了報(bào)文P2蹄皱,如果能夠讀取超過一個(gè)報(bào)文的數(shù)據(jù)览闰,那么就會將P1和P2的數(shù)據(jù)合并在了一 起,這樣的數(shù)據(jù)是沒有意義的巷折。
TCP三次握手和四次揮手
相對于SOCKET開發(fā)者压鉴,TCP創(chuàng)建過程和連接拆除過程是由 TCP/IP 協(xié)議棧自動(dòng)創(chuàng)建的。因此開發(fā)者并不需要控制這個(gè)過程锻拘。但是對于理解TCP底層運(yùn)作機(jī)制油吭,相當(dāng)有幫助。
因此在這里詳細(xì)解釋一下這兩個(gè)過程。
TCP三次握手
所謂三次握手(Three-way Handshake)上鞠,是指建立一個(gè)TCP連接時(shí)际邻,需要客戶端和服務(wù)器總共發(fā)送3個(gè)包芯丧。
三次握手的目的是連接服務(wù)器指定端口芍阎,建立TCP連接,并同步連接雙方的序列號和確認(rèn)號并交換 TCP 窗口大小信息.在 Socket 編程中,客戶端執(zhí)行connect()時(shí)缨恒。將觸發(fā)三次握手谴咸。
首先了解一下幾個(gè)標(biāo)志,SYN(synchronous)骗露,同步標(biāo)志岭佳,ACK (Acknowledgement),即確認(rèn)標(biāo)志萧锉,seq應(yīng)該是Sequence Number珊随,序列號的意思,另外還有四次握手的fin柿隙,應(yīng)該是final叶洞,表示結(jié)束標(biāo)志。
第一次握手:客戶端發(fā)送一個(gè)TCP的SYN標(biāo)志位置1的包指明客戶打算連接的服務(wù)器的端口禀崖,以及初始序號X,保存在包頭的序列號(Sequence Number)字段里衩辟。
第二次握手:服務(wù)器發(fā)回確認(rèn)包(ACK)應(yīng)答。即SYN標(biāo)志位和ACK標(biāo)志位均為1同時(shí)波附,將確認(rèn)序號(Acknowledgement Number)設(shè)置為客戶的序列號加1以艺晴,即X+1。
第三次握手:客戶端再次發(fā)送確認(rèn)包(ACK) SYN標(biāo)志位為0掸屡,ACK標(biāo)志位為1封寞。并且把服務(wù)器發(fā)來ACK的序號字段+1,放在確定字段中發(fā)送給對方.并且在數(shù)據(jù)段放寫序列號的+1仅财。
tcp四次揮手
TCP的連接的拆除需要發(fā)送四個(gè)包钥星,因此稱為四次揮手(four-way handshake)÷牛客戶端或服務(wù)器均可主動(dòng)發(fā)起揮手動(dòng)作谦炒,在socket
編程中,任何一方執(zhí)行close()操作即可產(chǎn)生揮手操作风喇。
其實(shí)有個(gè)問題宁改,為什么連接的時(shí)候是三次握手,關(guān)閉的時(shí)候卻是四次揮手魂莫?
這是因?yàn)榉?wù)端的LISTEN狀態(tài)下的SOCKET當(dāng)收到SYN報(bào)文的建連請求后还蹲,它可以把ACK和SYN(ACK起應(yīng)答作用,而SYN起同步作用)放在一個(gè)報(bào)文里來發(fā)送。但關(guān)閉連接時(shí)谜喊,當(dāng)收到對方的FIN報(bào)文通知時(shí)潭兽,它僅僅表示對方?jīng)]有數(shù)據(jù)發(fā)送給你了;但未必你所有的數(shù)據(jù)都全部發(fā)送給對方了斗遏,所以你可以未必會馬上會關(guān)閉SOCKET,也即你可能還需要發(fā)送一些數(shù)據(jù)給對方之后山卦,再發(fā)送FIN報(bào)文給對方來表示你同意現(xiàn)在可以關(guān)閉連接了,所以它這里的ACK報(bào)文和FIN報(bào)文多數(shù)情況下都是分開發(fā)送的
三次握手 四次揮手 詳解
http://uule.iteye.com/blog/2213562
http://blog.csdn.net/yusiguyuan/article/details/38987153
tcpsocket和udpsocket的具體實(shí)現(xiàn)
tcp和udp的socket是有區(qū)別的诵次,這里給出這兩種的設(shè)計(jì)框架
基本TCP客戶—服務(wù)器程序設(shè)計(jì)基本框架
基本UDP客戶—服務(wù)器程序設(shè)計(jì)基本框架流程圖
常用的Socket類型有兩種:流式Socket(SOCK_STREAM)和數(shù)據(jù)報(bào)式Socket(SOCK_DGRAM)账蓉。流式是一種面向連接的 Socket,針對于面向連接的TCP服務(wù)應(yīng)用逾一;數(shù)據(jù)報(bào)式 Socket 是一種無連接的 Socket 铸本,對應(yīng)于無連接的UDP服務(wù)應(yīng)用。
SYN(synchronous)是TCP/IP建立連接時(shí)使用的握手信號遵堵。在客戶機(jī)和服務(wù)器之間建立正常的TCP網(wǎng)絡(luò)連接時(shí)箱玷,客戶機(jī)首先發(fā)出一個(gè)SYN消息,服務(wù)器使用SYN+ACK應(yīng)答表示接收到了這個(gè)消息陌宿,最后客戶機(jī)再以ACK消息響應(yīng)锡足。這樣在客戶機(jī)和服務(wù)器之間才能建立起可靠的TCP連接,數(shù)據(jù)才可以在客戶機(jī)和服務(wù)器之間傳遞限番。
ACK (Acknowledgement)舱污,即確認(rèn)字符,在數(shù)據(jù)通信中弥虐,接收站發(fā)給發(fā)送站的一種傳輸類控制字符扩灯。表示發(fā)來的數(shù)據(jù)已確認(rèn)接收無誤
PID(Process Identification)操作系統(tǒng)里指進(jìn)程識別號,也就是進(jìn)程標(biāo)識符霜瘪。操作系統(tǒng)里每打開一個(gè)程序都會創(chuàng)建一個(gè)進(jìn)程ID珠插,即PID。
參考資料
http://www.cnblogs.com/developer-ios/p/6235094.html
http://www.reibang.com/p/58676adf8db8
http://www.cnblogs.com/dongliu/p/5455331.html
socket
http://baike.baidu.com/link?url=9n9Af70OsYtdOFl3N5zrOki1zKWXoCgSX6gwiZiQr-DuS7yDGmMoIrI0Pu8AqzuR0k26CRKc6CgpQvdS7EMRhq
http://www.cnblogs.com/dolphinX/p/3460545.html
名詞解釋
http://baike.baidu.com/item/ACK
http://baike.baidu.com/link?url=vr1-n480-UcaBsNKttoJqwBGG8mXoLz5CNRf7fqVEVyrCatmfRLQuDLcDGqoVqJDehcvE_SWDAXzbnTqQ6Troa
http://baike.baidu.com/link?url=d8bDx7Bi9EozOQzWG5DJCOgpOsIH9EXRivniOXzg3tNbHfhRXJMJDfS05BSxLmxwV5373aSdFv7SgWPs_m544K
http://www.52im.net/thread-561-1-1.html
node.js 安裝
http://blog.csdn.net/u010053344/article/details/50545304