網(wǎng)絡(luò)編程原理

iOS網(wǎng)絡(luò)HTTP、TCP震捣、UDP荔棉、Socket 知識總結(jié)
OSI 七層模型
  我們一般使用的網(wǎng)絡(luò)數(shù)據(jù)傳輸由下而上共有七層,分別為物理層、數(shù)據(jù)鏈路層蒿赢、網(wǎng)絡(luò)層润樱、傳輸層、會話層羡棵、表示層壹若、應(yīng)用層,也被依次稱為 OSI 第一層、第二層、??舌稀、 第七層啊犬。

808763-20160503155619841-1535147252.gif

各層功能簡介

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 模型

808763-20160503170145716-1621254072.jpg

  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ū)別

808763-20160503161408294-839809904.jpg

  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在哪里拇厢?

808763-20160503170622466-1166765855.jpg

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ā)三次握手谴咸。

TCP三次握手.png

  首先了解一下幾個(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)生揮手操作风喇。

TCP四次揮手.png
其實(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ì)基本框架

TCP服務(wù)器客戶端設(shè)計(jì).jpg

基本UDP客戶—服務(wù)器程序設(shè)計(jì)基本框架流程圖

UDP服務(wù)器客戶端設(shè)計(jì).jpg

  
常用的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。

屏幕快照 2017-05-30 上午11.09.51.png

參考資料
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

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末颖对,一起剝皮案震驚了整個(gè)濱河市捻撑,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌缤底,老刑警劉巖顾患,帶你破解...
    沈念sama閱讀 216,496評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異个唧,居然都是意外死亡江解,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,407評論 3 392
  • 文/潘曉璐 我一進(jìn)店門徙歼,熙熙樓的掌柜王于貴愁眉苦臉地迎上來犁河,“玉大人鳖枕,你說我怎么就攤上這事〗奥荩” “怎么了宾符?”我有些...
    開封第一講書人閱讀 162,632評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長灭翔。 經(jīng)常有香客問我魏烫,道長,這世上最難降的妖魔是什么缠局? 我笑而不...
    開封第一講書人閱讀 58,180評論 1 292
  • 正文 為了忘掉前任则奥,我火速辦了婚禮考润,結(jié)果婚禮上狭园,老公的妹妹穿的比我還像新娘。我一直安慰自己糊治,他們只是感情好唱矛,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,198評論 6 388
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著井辜,像睡著了一般绎谦。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上粥脚,一...
    開封第一講書人閱讀 51,165評論 1 299
  • 那天窃肠,我揣著相機(jī)與錄音,去河邊找鬼刷允。 笑死冤留,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的树灶。 我是一名探鬼主播纤怒,決...
    沈念sama閱讀 40,052評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼天通!你這毒婦竟也來了泊窘?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,910評論 0 274
  • 序言:老撾萬榮一對情侶失蹤像寒,失蹤者是張志新(化名)和其女友劉穎烘豹,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體诺祸,經(jīng)...
    沈念sama閱讀 45,324評論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡携悯,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,542評論 2 332
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了序臂。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片蚌卤。...
    茶點(diǎn)故事閱讀 39,711評論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡实束,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出逊彭,到底是詐尸還是另有隱情咸灿,我是刑警寧澤,帶...
    沈念sama閱讀 35,424評論 5 343
  • 正文 年R本政府宣布侮叮,位于F島的核電站避矢,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏囊榜。R本人自食惡果不足惜审胸,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,017評論 3 326
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望卸勺。 院中可真熱鬧砂沛,春花似錦、人聲如沸曙求。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,668評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽悟狱。三九已至静浴,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間挤渐,已是汗流浹背苹享。 一陣腳步聲響...
    開封第一講書人閱讀 32,823評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留浴麻,地道東北人得问。 一個(gè)月前我還...
    沈念sama閱讀 47,722評論 2 368
  • 正文 我出身青樓,卻偏偏與公主長得像白胀,于是被迫代替她去往敵國和親椭赋。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,611評論 2 353

推薦閱讀更多精彩內(nèi)容

  • 1. 網(wǎng)絡(luò)編程概述 1.1 計(jì)算機(jī)網(wǎng)絡(luò) 是指將地理位置不同的具有獨(dú)立功能的多臺計(jì)算機(jī)及其外部設(shè)備或杠,通過通信線路連接...
    JackChen1024閱讀 1,035評論 0 3
  • 網(wǎng)絡(luò)概念第一天 兩臺電腦怎么通過網(wǎng)絡(luò)傳輸數(shù)據(jù)哪怔?怎樣才能知道傳輸?shù)氖菙?shù)據(jù)?誰摸過網(wǎng)線向抢? 看電影认境,怎么看的?通過電流挟鸠,...
    小吖朱閱讀 1,554評論 0 1
  • 個(gè)人認(rèn)為叉信,Goodboy1881先生的TCP /IP 協(xié)議詳解學(xué)習(xí)博客系列博客是一部非常精彩的學(xué)習(xí)筆記,這雖然只是...
    貳零壹柒_fc10閱讀 5,054評論 0 8
  • 待碼字啊
    CHERESherry閱讀 202評論 0 0
  • 雞蛋跌至1.99元了 商家再不用搞促銷活動(dòng)了 你再不用討價(jià)還價(jià)了 孩子每天都能比往常多吃1個(gè) 還以為這是對她的獎(jiǎng)賞...
    倩何人換取閱讀 250評論 0 1