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è)備,又能使各個廠家的產(chǎn)品能夠相互兼容裕寨。?
2.數(shù)據(jù)鏈路層(Data Link Layer)?
在物理層發(fā)送和接收數(shù)據(jù)的過程中,會出現(xiàn)一些物理層自己不能解決的問題浩蓉。例如, 當(dāng)兩個節(jié)點(diǎn)同時試圖在一條線路上發(fā)送數(shù)據(jù)時該如何處理?節(jié)點(diǎn)如何知道它所接收的數(shù)據(jù) 是否正確?如果噪聲改變了一個分組的目標(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)為一條無錯線路。為了能夠?qū)崿F(xiàn)相鄰節(jié)點(diǎn)之間無差錯的數(shù)據(jù)傳送,數(shù)據(jù)鏈路層在數(shù)據(jù)傳輸過程中提供了確認(rèn)捻艳、差錯控制和流量控制等機(jī)制驾窟。
3.網(wǎng)絡(luò)層(Network Layer)?
網(wǎng)絡(luò)中的兩臺計算機(jī)進(jìn)行通信時,中間可能要經(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)中同時出現(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)確有效地傳輸;它上面的三個層次則面向用戶主機(jī),為用戶提供各種服務(wù)拳锚。?
傳輸層通過彌補(bǔ)網(wǎng)絡(luò)層服務(wù)質(zhì)量的不足,為會話層提供端到端的可靠數(shù)據(jù)傳輸服務(wù)假栓。它為會話層屏蔽了傳輸層以下的數(shù)據(jù)通信的細(xì)節(jié),使會話層不會受到下三層技術(shù)變化的影響。但同時,它又依靠下面的三個層次控制實(shí)際的網(wǎng)絡(luò)通信操作,來完成數(shù)據(jù)從源到目標(biāo)的傳輸霍掺。傳輸層為了向會話層提供可靠的端到端傳輸服務(wù),也使用了差錯控制和流量控制等機(jī)制匾荆。?
5.會話層(Session Layer)?
會話層的功能是在兩個節(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ù)的語法和語義烤芦。它主要涉及處理在兩個通信系統(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)于錯誤糾正和控 制數(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ù)時,可以只使用傳輸層(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é)議扩劝,而是一個調(diào)用接口(API)庸论,通過Socket,我們才能使用TCP/IP 協(xié)議棒呛。
TCP/IP?模型?
TCP/IP 模型是由美國國防部創(chuàng)建的,所以有時又稱 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ù)報并將 IP 數(shù)據(jù)報通過底層物理網(wǎng)絡(luò)發(fā)送出去,或者從底層物理網(wǎng)絡(luò)上接收物理幀,抽出 IP 數(shù)據(jù)報,交給互聯(lián)網(wǎng)層。網(wǎng)絡(luò)訪問層使采用不同技術(shù)和網(wǎng)絡(luò)硬件的網(wǎng)絡(luò)之間能夠互聯(lián), 它包括屬于操作系統(tǒng)的設(shè)備驅(qū)動器和計算機(jī)網(wǎng)絡(luò)接口卡,以處理具體的硬件物理接口皱坛。?
網(wǎng)際層負(fù)責(zé)獨(dú)立地將分組從源主機(jī)送往目標(biāo)主機(jī),涉及為分組提供最佳路徑的選擇和 交換功能,并使這一過程與它們所經(jīng)過的路徑和網(wǎng)絡(luò)無關(guān)编曼。這好比你寄信時,你并不需要知道它是如何到達(dá)目的地的,而只關(guān)心它是否到達(dá)了。TCP/IP 模型的互聯(lián)網(wǎng)層在功能上非常類似于 OSI 參考模型中的網(wǎng)絡(luò)層剩辟。?
傳輸層的作用與 OSI 參考模型中傳輸層的作用是類似的,即在源結(jié)點(diǎn)和目的結(jié)點(diǎn)的兩個對等實(shí)體間提供可靠的端到端的數(shù)據(jù)通信掐场。為保證數(shù)據(jù)傳輸?shù)目煽啃?傳輸層協(xié)議也提供了確認(rèn)往扔、差錯控制和流量控制等機(jī)制。另外,由在一般的計算機(jī)中,常常是多個應(yīng)用程序同時訪問網(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ù)鏈路層和物理層包括到了一個網(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)的,或者說是不可以信任的王滤。?
什么時候用長連接贺嫂,短連接???
長連接多用于操作頻繁雁乡,點(diǎn)對點(diǎn)的通訊第喳,而且連接數(shù)不能太多情況,踱稍。每個TCP連接都需要三步握手曲饱,這需要時間吩跋,如果每個操作都是先連接,再操作的話那么處理 速度會降低很多渔工,所以每個操作完后都不斷開,次處理時直接發(fā)送數(shù)據(jù)包就OK了桥温,不用建立TCP連接引矩。例如:數(shù)據(jù)庫的連接用長連接, 如果用短連接頻繁的通信會造成?Socket?錯誤侵浸,而且頻繁的?Socket?創(chuàng)建也是對資源的浪費(fèi)旺韭。
而像WEB網(wǎng)站的http服務(wù)一般都用短鏈接,因為長連接對于服務(wù)端來說會耗費(fèi)一定的資源掏觉,而像WEB網(wǎng)站這么頻繁的成千上萬甚至上億客戶端的連接用短連接 會更省一些資源区端,如果用長連接,而且同時有成千上萬的用戶澳腹,如果每個用戶都占用一個連接的話织盼,那可想而知吧。所以并發(fā)量大酱塔,但每個用戶無需頻繁操作情況下 需用短連好沥邻。?
總之,長連接和短連接的選擇要視情況而定羊娃。
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é)束后延届,會主動釋放連接。從建立連接到關(guān)閉連接的過程稱為“一次連接”挺智。
1)在HTTP 1.0中祷愉,客戶端的每次請求都要求建立一次單獨(dú)的連接,在處理完本次請求后赦颇,就自動釋放連接二鳄。
2)在HTTP 1.1中則可以在一次連接中處理多個請求,并且多個請求可以重疊進(jìn)行媒怯,不需要等待一個請求結(jié)束后再發(fā)送下一個請求订讼。
由于HTTP在每次請求結(jié)束后都會主動釋放連接,因此HTTP連接是一種“短連接”扇苞,要保持客戶端程序的在線狀態(tài)欺殿,需要不斷地向服務(wù)器發(fā)起連接請求寄纵。通常的 做法是即時不需要獲得任何數(shù)據(jù),客戶端也保持每隔一段固定的時間向服務(wù)器發(fā)送一次“保持連接”的請求脖苏,服務(wù)器在收到該請求后對客戶端進(jìn)行回復(fù)程拭,表明知道客 戶端“在線”。若服務(wù)器長時間無法收到客戶端的請求棍潘,則認(rèn)為客戶端“下線”恃鞋,若客戶端長時間無法收到服務(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ù)通信時,TCP會遇到同時為多個應(yīng)用程序進(jìn)程提供并發(fā)服務(wù)的問題晌姚。多個TCP連接或多個應(yīng)用程序進(jìn)程可能需要通過同一個 TCP協(xié)議端口傳輸數(shù)據(jù)粤剧。為了區(qū)別不同的應(yīng)用程序進(jìn)程和連接,許多計算機(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 連接至少需要一對套接字,其中一個運(yùn)行于客戶端唤锉,稱為ClientSocket世囊,另一個運(yùn)行于服務(wù)器端,稱為ServerSocket窿祥。
套接字之間的連接過程分為三個步驟:服務(wù)器監(jiān)聽株憾,客戶端請求,連接確認(rèn)。
服務(wù)器監(jiān)聽:服務(wù)器端套接字并不定位具體的客戶端套接字嗤瞎,而是處于等待連接的狀態(tài)墙歪,實(shí)時監(jiān)控網(wǎng)絡(luò)狀態(tài),等待客戶端的連接請求贝奇。
客戶端請求:指客戶端的套接字提出連接請求虹菲,要連接的目標(biāo)是服務(wù)器端的套接字。為此掉瞳,客戶端的套接字必須首先描述它要連接的服務(wù)器的套接字届惋,指出服務(wù)器端套接字的地址和端口號,然后就向服務(wù)器端套接字提出連接請求菠赚。
連接確認(rèn):當(dāng)服務(wù)器端套接字監(jiān)聽到或者說接收到客戶端套接字的連接請求時,就響應(yīng)客戶端套接字的請求郑藏,建立一個新的線程衡查,把服務(wù)器端套接字的描述發(fā)給客戶端,一旦客戶端確認(rèn)了此描述必盖,雙方就正式建立連接拌牲。而服務(wù)器端套接字繼續(xù)處于監(jiān)聽狀態(tài),繼續(xù)接收其他客戶端套接字的連接請求歌粥。
?c塌忽、Socket連接與TCP連接
創(chuàng)建Socket連接時,可以指定使用的傳輸層協(xié)議失驶,Socket可以支持不同的傳輸層協(xié)議(TCP或UDP)土居,當(dāng)使用TCP協(xié)議進(jìn)行連接時,該Socket連接就是一個TCP連接嬉探。
?d擦耀、Socket連接與HTTP連接
由于通常情況下 Socket 連接就是TCP連接,因此 Socket 連接一旦建立涩堤,通信雙方即可開始相互發(fā)送數(shù)據(jù)內(nèi)容眷蜓,直到雙方連接斷開。但在實(shí)際網(wǎng)絡(luò)應(yīng)用中胎围,客戶端到服務(wù)器之間的通信往往需要穿越多個中間節(jié)點(diǎn)吁系,例如路由器、網(wǎng)關(guān)白魂、防火墻等汽纤,大部分防火墻默認(rèn)會關(guān)閉長時間處于非活躍狀態(tài)的連接而導(dǎo)致 Socket 連接斷連,因此需要通過輪詢告訴網(wǎng)絡(luò)碧聪,該連接處于活躍狀態(tài)冒版。
而HTTP連接使用的是“請求—響應(yīng)”的方式,不僅在請求時需要先建立連接逞姿,而且需要客戶端向服務(wù)器發(fā)出請求后辞嗡,服務(wù)器端才能回復(fù)數(shù)據(jù)捆等。
很多情況下,需要服務(wù)器端主動向客戶端推送數(shù)據(jù)续室,保持客戶端與服務(wù)器數(shù)據(jù)的實(shí)時與同步栋烤。此時若雙方建立的是Socket連接,服務(wù)器就可以直接將數(shù)據(jù)傳送給 客戶端挺狰;若雙方建立的是HTTP連接明郭,則服務(wù)器需要等到客戶端發(fā)送一次請求后才能將數(shù)據(jù)傳回給客戶端,因此丰泊,客戶端定時向服務(wù)器端發(fā)送連接請求薯定,不僅可以保持在線,同時也是在“詢問”服務(wù)器是否有新的數(shù)據(jù)瞳购,如果有就將數(shù)據(jù)傳給客戶端话侄。
tcp和udp的區(qū)別
TCP是面向連接的、傳輸可靠(保證數(shù)據(jù)正確性且保證數(shù)據(jù)順序)学赛、用于傳輸大量數(shù)據(jù)(流模式)年堆、速度慢,建立連接需要開銷較多(時間盏浇,系統(tǒng)資源)变丧。
TCP是一種流模式的協(xié)議,是面向連接的绢掰,也就是說痒蓬,在連接持續(xù)的過程中,Socket 中收到的數(shù)據(jù)都是由同一臺主機(jī)發(fā)出的(劫持什么的不考慮)滴劲,因此谊却,知道保證數(shù)據(jù)是有序的到達(dá)就行了,至于每次讀取多少數(shù)據(jù)不關(guān)心哑芹。
TCP:面向連接炎辨、傳輸可靠(保證數(shù)據(jù)正確性,保證數(shù)據(jù)順序)、用于傳輸大量數(shù)據(jù)(流模式)聪姿、速度慢碴萧,建立連接需要開銷較多(時間,系統(tǒng)資源)末购。
UDP:面向非連接破喻、傳輸不可靠、用于傳輸少量數(shù)據(jù)(數(shù)據(jù)包模式)盟榴、速度快曹质。
關(guān)于TCP是一種流模式的協(xié)議,UDP是一種數(shù)據(jù)報模式的協(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ù)據(jù),則會亂套履磨。比如,主機(jī)A向發(fā)送了報文P1庆尘,主機(jī)B發(fā)送了報文P2剃诅,如果能夠讀取超過一個報文的數(shù)據(jù),那么就會將P1和P2的數(shù)據(jù)合并在了一 起驶忌,這樣的數(shù)據(jù)是沒有意義的矛辕。
TCP三次握手和四次揮手
相對于SOCKET開發(fā)者,TCP創(chuàng)建過程和連接拆除過程是由 TCP/IP 協(xié)議棧自動創(chuàng)建的付魔。因此開發(fā)者并不需要控制這個過程聊品。但是對于理解TCP底層運(yùn)作機(jī)制,相當(dāng)有幫助几苍。
因此在這里詳細(xì)解釋一下這兩個過程翻屈。
TCP三次握手
所謂三次握手(Three-way Handshake),是指建立一個TCP連接時妻坝,需要客戶端和服務(wù)器總共發(fā)送3個包伸眶。
三次握手的目的是連接服務(wù)器指定端口,建立TCP連接,并同步連接雙方的序列號和確認(rèn)號并交換 TCP 窗口大小信息.在 Socket 編程中刽宪,客戶端執(zhí)行connect()時厘贼。將觸發(fā)三次握手。?
首先了解一下幾個標(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ā)送一個TCP的SYN標(biāo)志位置1的包指明客戶打算連接的服務(wù)器的端口剖煌,以及初始序號X,保存在包頭的序列號(Sequence Number)字段里材鹦。
第二次握手:服務(wù)器發(fā)回確認(rèn)包(ACK)應(yīng)答。即SYN標(biāo)志位和ACK標(biāo)志位均為1同時耕姊,將確認(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规脸。
三次握手可以簡單標(biāo)記為:
第一次握手:我想要給你發(fā)東西坯约,可以嗎?
第二次握手:可以莫鸭,你什么時候發(fā)闹丐?
第三次握手,我現(xiàn)在就發(fā)被因,卿拴,,
tcp四次揮手
TCP的連接的拆除需要發(fā)送四個包梨与,因此稱為四次揮手(four-way handshake)堕花。客戶端或服務(wù)器均可主動發(fā)起揮手動作粥鞋,在socket
編程中缘挽,任何一方執(zhí)行close()操作即可產(chǎn)生揮手操作。
其實(shí)有個問題呻粹,為什么連接的時候是三次握手到踏,關(guān)閉的時候卻是四次揮手?
因為當(dāng)Server端收到Client端的SYN連接請求報文后尚猿,可以直接發(fā)送SYN+ACK報文窝稿。其中ACK報文是用來應(yīng)答的,SYN報文是用來 同步的凿掂。但是關(guān)閉連接時伴榔,當(dāng)Server端收到FIN報文時纹蝴,很可能并不會立即關(guān)閉SOCKET,所以只能先回復(fù)一個ACK報文踪少,告訴Client端塘安,” 你發(fā)的FIN報文我收到了”。只有等到我Server端所有的報文都發(fā)送完了援奢,我才能發(fā)送FIN報文兼犯,因此不能一起發(fā)送。故需要四步握手集漾。
tcpsocket和udpsocket的具體實(shí)現(xiàn)
tcp和udp的socket是有區(qū)別的切黔,這里給出這兩種的設(shè)計框架
基本TCP客戶—服務(wù)器程序設(shè)計基本框架
基本UDP客戶—服務(wù)器程序設(shè)計基本框架流程圖
常用的Socket類型有兩種:流式Socket(SOCK_STREAM)和數(shù)據(jù)報式Socket(SOCK_DGRAM)。流式是一種面向連接的 Socket具篇,針對于面向連接的TCP服務(wù)應(yīng)用纬霞;數(shù)據(jù)報式 Socket 是一種無連接的 Socket ,對應(yīng)于無連接的UDP服務(wù)應(yīng)用驱显。?