定義
網(wǎng)絡(luò)協(xié)議為計算機網(wǎng)絡(luò)中進行數(shù)據(jù)交換而建立的規(guī)則胀蛮、標準或約定的集合。網(wǎng)絡(luò)協(xié)議主要由三個要素組成:語義渐白、語法及時序尊浓;語義表示要做什么,語法表示要怎么做纯衍,時序表示做的順序栋齿。網(wǎng)絡(luò)協(xié)議是網(wǎng)絡(luò)上所有設(shè)備(網(wǎng)絡(luò)服務(wù)器、計算機襟诸、交換機瓦堵、路由器、防火墻等)之間通信規(guī)則的集合歌亲,它規(guī)定了通信時信息必須采用的格式和這些格式的意義菇用。由于網(wǎng)絡(luò)節(jié)點之間聯(lián)系的復(fù)雜性,在制定協(xié)議時陷揪,通常把復(fù)雜成分分解成一些簡單成分惋鸥,然后再將它們復(fù)合起來杂穷。最常用的復(fù)合技術(shù)就是層次方式,網(wǎng)絡(luò)協(xié)議的層次結(jié)構(gòu)如下:(1)結(jié)構(gòu)中的每一層都規(guī)定有明確的服務(wù)及接口標準卦绣。(2)把用戶的應(yīng)用程序作為最高層耐量。(3)除了最高層外,中間的每一層都向上一層提供服務(wù)滤港,同時又是下一層的用戶廊蜒。(4)把物理通信線路作為最低層,它使用從最高層傳送來的參數(shù)溅漾,是提供服務(wù)的基礎(chǔ)劲藐。
分層詳情
為了使不同計算機廠家生產(chǎn)的計算機能夠相互通信,以便在更大的范圍內(nèi)建立計算機網(wǎng)絡(luò)樟凄,國際標準化組織(ISO)在1978年提出了“開放系統(tǒng)互聯(lián)參考模型”聘芜,即著名的OSI/RM模型(Open System Interconnection/Reference Model)。它將計算機網(wǎng)絡(luò)體系結(jié)構(gòu)的通信協(xié)議劃分為七層缝龄,自下而上依次為:物理層(Physics Layer)汰现、數(shù)據(jù)鏈路層(Data Link Layer)、網(wǎng)絡(luò)層(Network Layer)叔壤、傳輸層(Transport Layer)瞎饲、會話層(Session Layer)、表示層(Presentation Layer)炼绘、應(yīng)用層(Application Layer)嗅战。其中第四層完成數(shù)據(jù)傳送服務(wù),上面三層面向用戶俺亮。對于每一層驮捍,至少制定兩項標準:服務(wù)定義和協(xié)議規(guī)范。前者給出了該層所提供的服務(wù)的準確定義脚曾,后者詳細描述了該協(xié)議的動作和各種有關(guān)規(guī)程东且,以保證服務(wù)的提供。以下為各層詳細介紹:第一層:物理層規(guī)定通信設(shè)備的機械的本讥、電氣的珊泳、功能的和過程的特性,用以建立拷沸、維護和拆除物理鏈路連接色查。具體地講,機械 特性規(guī)定了網(wǎng)絡(luò)連接時所需接插件的規(guī)格尺寸撞芍、引腳數(shù)量和排列情況等秧了;電氣特性規(guī)定了在物理連接上傳輸bit流時線路上信號電平的大小、阻抗匹配勤庐、傳輸速率 距離限制等;功能特性是指對各個信號先分配確切的信號含義,即定義了DTE和DCE之間各個線路的功能鸽嫂;規(guī)程特性定義了利用信號線進行bit流傳輸?shù)囊唤M操作規(guī)程浮定。在這一層,數(shù)據(jù)的單位稱為比特(bit)丈探。屬于物理層定義的包括:以太網(wǎng)录择、調(diào)制解調(diào)器、電力線通信(PLC)碗降、SONET/SDH隘竭、G.709、光導(dǎo)纖維讼渊、同軸電纜动看、雙絞線等。
第二層:數(shù)據(jù)鏈路層在物理層提供比特流服務(wù)的基礎(chǔ)上爪幻,建立相鄰結(jié)點之間的數(shù)據(jù)鏈路菱皆,通過差錯控制提供數(shù)據(jù)幀(Frame)在信道上無差錯的傳輸,并進行各電路上的動作系列挨稿。數(shù)據(jù)鏈路層在不可靠的物理介質(zhì)上提供可靠的傳輸仇轻。該層的作用包括:物理地址尋址、數(shù)據(jù)的成幀奶甘、流量控制篷店、數(shù)據(jù)的檢錯、重發(fā)等臭家。在這一層疲陕,數(shù)據(jù)的單位稱為幀(Frame)。屬于數(shù)據(jù)鏈路層的包括:Wi-Fi(IEEE 802.11)钉赁、WiMAX(IEEE 802.16)鸭轮、ATM、DTM橄霉、令牌環(huán)窃爷、以太網(wǎng)、FDDI姓蜂、幀中繼按厘、GPRS、EVDO钱慢、HSPA逮京、HDLC、PPP束莫、L2TP懒棉、PPTP草描、ISDN、STP等策严。
第三層:網(wǎng)絡(luò)層在計算機網(wǎng)絡(luò)中進行通信的兩個計算機之間可能會經(jīng)過很多個數(shù)據(jù)鏈路穗慕,也可能還要經(jīng)過很多通信子網(wǎng)。網(wǎng)絡(luò)層的任務(wù)就是選擇合適的網(wǎng)間路由和交換結(jié)點妻导, 確保數(shù)據(jù)及時傳送逛绵。網(wǎng)絡(luò)層將數(shù)據(jù)鏈路層提供的幀組成數(shù)據(jù)包,包中封裝有網(wǎng)絡(luò)層包頭倔韭,其中含有邏輯地址信息–源站點和目的站點地址的網(wǎng)絡(luò)地址术浪。如果你在談?wù)撘粋€IP地址,那么你是在處理第三層的問題寿酌,這是“數(shù)據(jù)包”問題胰苏,而不是第二層的“幀”。IP是第三層問題的一部分醇疼,此外還有一些路由協(xié)議和地址解析協(xié)議(ARP)碟联。有關(guān)路由的一切事情都在這第三層處理。地址解析和路由是三層的重要目的僵腺。網(wǎng)絡(luò)層還可以實現(xiàn)擁塞控制鲤孵、網(wǎng)際互連等功能。在這一層辰如,數(shù)據(jù)的單位稱為數(shù)據(jù)包(packet)普监。網(wǎng)絡(luò)層的協(xié)議包括:IP(IPv4、IPv6)琉兜、ICMP凯正、ICMPv6、IGMP豌蟋、IS-IS廊散、IPsec、ARP梧疲、RARP等允睹。
第四層:傳輸層第4層的數(shù)據(jù)單元也稱作數(shù)據(jù)包(packets)。但是幌氮,當你談?wù)揟CP等具體的協(xié)議時又有特殊的叫法缭受,TCP的數(shù)據(jù)單元稱為段 (segments)而UDP協(xié)議的數(shù)據(jù)單元稱為“數(shù)據(jù)報(datagrams)”。這個層負責(zé)獲取全部信息该互,因此米者,它必須跟蹤數(shù)據(jù)單元碎片、亂序到達的 數(shù)據(jù)包和其它在傳輸過程中可能發(fā)生的危險。第4層為上層提供端到端(最終用戶到最終用戶)的透明的蔓搞、可靠的數(shù)據(jù)傳輸服務(wù)胰丁。所為透明的傳輸是指在通信過程中 傳輸層對上層屏蔽了通信傳輸系統(tǒng)的具體細節(jié)。傳輸層的協(xié)議包括:TCP喂分、UDP锦庸、TLS、DCCP妻顶、SCTP酸员、RSVP蜒车、OSPF等讳嘱。
第五層:會話層這一層也可以稱為會晤層或?qū)υ拰樱跁拰蛹耙陨系母邔哟沃心鹄ⅲ瑪?shù)據(jù)傳送的單位不再另外命名沥潭,而是統(tǒng)稱為報文。會話層不參與具體的傳輸嬉挡,它提供包括訪問驗證和會話管理在內(nèi)的建立和維護應(yīng)用之間通信的機制钝鸽。如服務(wù)器驗證用戶登錄便是由會話層完成的。
第六層:表示層這一層主要解決擁護信息的語法表示問題庞钢。它將欲交換的數(shù)據(jù)從適合于某一用戶的抽象語法拔恰,轉(zhuǎn)換為適合于OSI系統(tǒng)內(nèi)部使用的傳送語法。即提供格式化的表示和轉(zhuǎn)換數(shù)據(jù)服務(wù)基括。數(shù)據(jù)的壓縮和解壓縮颜懊, 加密和解密等工作都由表示層負責(zé)。
第七層:應(yīng)用層應(yīng)用層為操作系統(tǒng)或網(wǎng)絡(luò)應(yīng)用程序提供訪問網(wǎng)絡(luò)服務(wù)的接口风皿。應(yīng)用層的協(xié)議包括:DHCP河爹、DNS、FTP桐款、Gopher咸这、HTTP、IMAP4魔眨、IRC媳维、NNTP、XMPP遏暴、POP3侨艾、SIP、SMTP拓挥、SNMP唠梨、SSH、TELNET侥啤、RPC当叭、RTCP茬故、RTP、RTSP蚁鳖、SDP磺芭、SOAP、GTP醉箕、STUN钾腺、NTP、SSDP讥裤、BGP放棒、RIP等。
概念及原理
- Socket(套接字)
套接字(socket)是通信的基石己英,是支持TCP/IP協(xié)議的網(wǎng)絡(luò)通信的基本操作單元间螟。它是網(wǎng)絡(luò)通信過程中端點的抽象表示,包含進行網(wǎng)絡(luò)通信必須的五種信息:連接使用的協(xié)議损肛,本地主機的IP地址厢破,本地進程的協(xié)議端口,遠地主機的IP地址治拿,遠地進程的協(xié)議端口摩泪。 - TCP連接
TCP連接包含三次握手過程,其過程介紹如下:第一次握手:客戶端發(fā)送syn包(syn=j)到服務(wù)器劫谅,并進入SYN_SEND狀態(tài)见坑,等待服務(wù)器確認;第二次握手:服務(wù)器收到syn包同波,必須確認客戶的SYN(ack=j+1)鳄梅,同時自己也發(fā)送一個SYN包(syn=k),即SYN+ACK包未檩,此時服務(wù)器進入SYN_RECV狀態(tài)戴尸;第三次握手:客戶端收到服務(wù)器的SYN+ACK包,向服務(wù)器發(fā)送確認包ACK(ack=k+1)冤狡,此包發(fā)送完畢孙蒙,客戶端和服務(wù)器進入ESTABLISHED狀態(tài),完成三次握手悲雳。握手過程中傳送的包里不包含數(shù)據(jù)挎峦,三次握手完畢后,客戶端與服務(wù)器才正式開始傳送數(shù)據(jù)合瓢。理想狀態(tài)下坦胶,TCP連接一旦建立,在通信雙方中的任何一方主動關(guān)閉連接之前,TCP連接都將被一直保持下去顿苇。斷開連接時服務(wù)器和客戶端均可以主動發(fā)起斷開TCP連接的請求峭咒,斷開過程需要經(jīng)過“四次握手”。 - Socket連接
由于通常情況下Socket連接就是TCP連接纪岁,因此Socket連接一旦建立凑队,通信雙方即可開始相互發(fā)送數(shù)據(jù)內(nèi)容,直到雙方連接斷開幔翰。但在實際網(wǎng)絡(luò)應(yīng)用中漩氨,客戶端到服務(wù)器之間的通信往往需要穿越多個中間節(jié)點,例如路由器遗增、網(wǎng)關(guān)叫惊、防火墻等,大部分防火墻默認會關(guān)閉長時間處于非活躍狀態(tài)的連接而導(dǎo)致 Socket連接斷連贡定,因此需要通過輪詢告訴網(wǎng)絡(luò)赋访,該連接處于活躍狀態(tài)可都。建立Socket連接至少需要一對套接字缓待,其中一個運行于客戶端,稱為ClientSocket 渠牲,另一個運行于服務(wù)器端旋炒,稱為ServerSocket。套接字之間的連接過程分為三個步驟:服務(wù)器監(jiān)聽签杈,客戶端請求瘫镇,連接確認。1答姥、服務(wù)器監(jiān)聽:服務(wù)器端套接字并不定位具體的客戶端套接字铣除,而是處于等待連接的狀態(tài),實時監(jiān)控網(wǎng)絡(luò)狀態(tài)鹦付,等待客戶端的連接請求尚粘。2、客戶端請求:指客戶端的套接字提出連接請求敲长,要連接的目標是服務(wù)器端的套接字郎嫁。為此,客戶端的套接字必須首先描述它要連接的服務(wù)器的套接字祈噪,指出服務(wù)器端套接字的地址和端口號泽铛,然后就向服務(wù)器端套接字提出連接請求。3辑鲤、連接確認:當服務(wù)器端套接字監(jiān)聽到或者說接收到客戶端套接字的連接請求時盔腔,就響應(yīng)客戶端套接字的請求,建立一個新的線程,把服務(wù)器端套接字的描述發(fā)給客戶端弛随,一旦客戶端確認了此描述澈蝙,雙方就正式建立連接。而服務(wù)器端套接字繼續(xù)處于監(jiān)聽狀態(tài)撵幽,繼續(xù)接收其他客戶端套接字的連接請求灯荧。 - HTTP連接
HTTP協(xié)議是建立在TCP協(xié)議之上的一種應(yīng)用,HTTP連接使用的是“請求—響應(yīng)”的方式盐杂,不僅在請求時需要先建立連接逗载,而且需要客戶端向服務(wù)器發(fā)出請求后,服務(wù)器端才能回復(fù)數(shù)據(jù)链烈。在請求結(jié)束后厉斟,會主動釋放連接。從建立連接到關(guān)閉連接的過程稱為“一次連接”强衡。由于HTTP在每次請求結(jié)束后都會主動釋放連接擦秽,因此HTTP連接是一種“短連接”,要保持客戶端程序的在線狀態(tài)漩勤,需要不斷地向服務(wù)器發(fā)起連接請求感挥。通常的做法是即時不需要獲得任何數(shù)據(jù),客戶端也保持每隔一段固定的時間向服務(wù)器發(fā)送一次“保持連接”的請求越败,服務(wù)器在收到該請求后對客戶端進行回復(fù)触幼,表明知道客戶端“在線”。若服務(wù)器長時間無法收到客戶端的請求究飞,則認為客戶端“下線”置谦,若客戶端長時間無法收到服務(wù)器的回復(fù),則認為網(wǎng)絡(luò)已經(jīng)斷開亿傅。 - TCP/IP協(xié)議和HTTP協(xié)議之間的關(guān)系
TPC/IP協(xié)議是傳輸層協(xié)議媒峡,主要解決數(shù)據(jù)如何在網(wǎng)絡(luò)中傳輸,而HTTP是應(yīng)用層協(xié)議葵擎,主要解決如何包裝數(shù)據(jù)谅阿。實際上HTTP協(xié)議就是建立在TCP/IP協(xié)議之上的。 - Socket和TCP/IP協(xié)議之間的關(guān)系
TCP/IP只是一個協(xié)議棧坪蚁,就像操作系統(tǒng)的運行機制一樣奔穿,必須要具體實現(xiàn),同時還要提供對外的操作接口敏晤。這個就像操作系統(tǒng)會提供標準的編程接口贱田,比如win32編程接口一樣,TCP/IP也要提供可供程序員做網(wǎng)絡(luò)開發(fā)所用的接口嘴脾,這就是Socket編程接口男摧。 - TCP/IP協(xié)議蔬墩,HTTP協(xié)議,Socket三者之間的關(guān)系
實際上耗拓,傳輸層的TCP是基于網(wǎng)絡(luò)層的IP協(xié)議的拇颅,而應(yīng)用層的HTTP協(xié)議又是基于傳輸層的TCP協(xié)議的,而Socket本身不算是協(xié)議乔询,它只是提供了一個針對TCP或者UDP編程的接口樟插。 - TCP協(xié)議
傳輸控制協(xié)議,提供的是面向連接竿刁、可靠的字節(jié)流服務(wù)黄锤。當客戶和服務(wù)器彼此交換數(shù)據(jù)前,必須先在雙方之間建立一個TCP連接食拜,之后才能傳輸數(shù)據(jù)。TCP提供超時重發(fā)负甸,丟棄重復(fù)數(shù)據(jù),檢驗數(shù)據(jù)打月,流量控制等功能带污,保證數(shù)據(jù)能從一端傳到另一端香到。 - UDP協(xié)議
用戶數(shù)據(jù)報協(xié)議,是一個無連接的簡單的面向數(shù)據(jù)報的傳輸層協(xié)議千绪。UDP不提供可靠性梗脾,它只是把應(yīng)用程序傳給IP層的數(shù)據(jù)報發(fā)送出去荸型,但是并不能保證它們能到達目的地。由于UDP在傳輸數(shù)據(jù)報前不用在客戶和服務(wù)器之間建立一個連接炸茧,且沒有超時重發(fā)等機制瑞妇,故而傳輸速度很快。 - TCP協(xié)議和UDP協(xié)議之間的區(qū)別
TCP發(fā)送的包有序號梭冠,對方收到包后要給一個反饋辕狰,如果超過一定時間還沒收到反饋就自動執(zhí)行超時重發(fā),因此TCP最大的優(yōu)點是可靠控漠。一般網(wǎng)頁(http)蔓倍、郵件(SMTP)悬钳、遠程連接(Telnet)、文件(FTP)傳送就用TCP偶翅。UDP是面向消息的協(xié)議默勾,通信時不需要建立連接,數(shù)據(jù)的傳輸自然是不可靠的聚谁,UDP一般用于多點通信和實時的數(shù)據(jù)業(yè)務(wù)母剥,比如語音廣播、視頻形导、QQ媳搪、TFTP(簡單文件傳送)、SNMP(簡單網(wǎng)絡(luò)管理協(xié)議)骤宣、RTP(實時傳送協(xié)議)RIP(路由信息協(xié)議秦爆,如報告股票市場,航空信息)憔披、DNS(域名解釋)等限。注重速度流暢望门。 - FTP協(xié)議
文件傳輸協(xié)議(File Transfer Protocol, FTP)是TCP/IP網(wǎng)絡(luò)上兩臺計算機傳送文件的協(xié)議,F(xiàn)TP是在TCP/IP網(wǎng)絡(luò)和INTERNET上最早使用的協(xié)議之一厨剪,它屬于網(wǎng)絡(luò)協(xié)議組的應(yīng)用層。FTP客戶機可以給服務(wù)器發(fā)出命令來下載文件直晨,上載文件勇皇,創(chuàng)建或改變服務(wù)器上的目錄。
協(xié)議詳解
- IP協(xié)議
IP協(xié)議是TCP/IP協(xié)議簇中的核心協(xié)議着撩,也是TCP/IP的載體拖叙。所有的TCP咖气,UDP崩溪,ICMP及IGMP數(shù)據(jù)都以IP數(shù)據(jù)報格式傳輸。IP提供不可靠的乳幸,無連接的數(shù)據(jù)傳送服務(wù)粹断。不可靠指它不能保證IP數(shù)據(jù)報能成功到達目的地。IP僅提供最好的傳輸服務(wù)诊沪。當發(fā)生某種錯誤時娄徊,如某個路由器暫時用完了緩沖區(qū),IP有一個簡單的錯誤處理算法:丟棄該數(shù)據(jù)報橄仆,然后發(fā)送ICMP消息給信源盆顾。任何要求的可靠性必須由上層來提供您宪。無連接指IP并不維護任何關(guān)于后續(xù)數(shù)據(jù)報的狀態(tài)信息宪巨。每個數(shù)據(jù)報的處理是相互獨立的极祸。IP數(shù)據(jù)報可以不按發(fā)送順序接收遥金。如果一信源向相同的信宿發(fā)送兩個連續(xù)的數(shù)據(jù)報(先是A,然后是B)每個數(shù)據(jù)報都是獨立的進行路由選擇溜哮,可能選擇不同的路線茂嗓,因此B可能在A到達之前先到達。IP實現(xiàn)兩個基本功能:尋址和分段蝌矛。IP可以根據(jù)數(shù)據(jù)包包頭中包括的目的地址將數(shù)據(jù)報傳送到目的地址入撒,在此過程中IP負責(zé)選擇傳送的道路,這種選擇道路稱為路由功能献雅。如果有些網(wǎng)絡(luò)內(nèi)只能傳送小數(shù)據(jù)報挺身,IP可以將數(shù)據(jù)報重新組裝并在報頭域內(nèi)注明墙贱。IP模塊中包括這些基本功能惨撇,這些模塊存在于網(wǎng)絡(luò)中的每臺主機和網(wǎng)關(guān)上串纺,而且這些模塊(特別在網(wǎng)關(guān)上)有路由選擇和其它服務(wù)功能。對IP來說祷蝌,數(shù)據(jù)報之間沒有什么聯(lián)系巨朦,對IP不好說什么連接或邏輯鏈路糊啡。IP使用四個關(guān)鍵技術(shù)提供服務(wù):服務(wù)類型棚蓄,生存時間,選項和報頭校驗碼役拴。服務(wù)類型指希望得到的服務(wù)質(zhì)量,服務(wù)類型是一個參數(shù)集淤击,這些參數(shù)是Internet能夠提供服務(wù)的代表,這種服務(wù)類型由網(wǎng)關(guān)使用印机,用于在特定的網(wǎng)絡(luò),或是用于下下一個要經(jīng)過的網(wǎng)絡(luò)奶是,或是下一個要對這個數(shù)據(jù)報進行路由的網(wǎng)關(guān)上選擇實際的傳送參數(shù)秆麸。生存時間是數(shù)據(jù)報可以生存的時間上限,它由發(fā)送者設(shè)置房铭,由經(jīng)過路由的地方處理,如果未到達時生存時間為零凌蔬,拋棄此數(shù)據(jù)報。對于控制函數(shù)來說選項是重要的窃躲,但對于通常的通信來說它沒有存在的必要躁倒,選項包括時間戳,安全和特殊路由。報頭校驗碼保證數(shù)據(jù)的正確傳輸砾淌,如果校驗出錯蜂厅,拋棄整個數(shù)據(jù)報。其協(xié)議頭解釋如下:
版本[4bit]指IP協(xié)議的版本。通信雙方使用的IP協(xié)議版本必須一致搏嗡。目前廣泛使用的IP協(xié)議版本號為4(即IPv4)。關(guān)于IPv6磅氨,目前還處于草案階段烦租。
首部長度[4bit]可表示的最大十進制數(shù)值是15。請注意除盏,這個字段所表示數(shù)的單位是32位字長(1個32位字長是4字節(jié))叉橱,因此,當IP的首部長度為1111時(即十進制的15)者蠕,首部長度就達到60字節(jié)窃祝。當IP分組的首部長度不是4字節(jié)的整數(shù)倍時,必須利用最后的填充字段加以填充踱侣。因此數(shù)據(jù)部分永遠在4字節(jié)的整數(shù)倍開始探膊,這樣在實現(xiàn)IP協(xié)議時較為方便袭灯。首部長度限制為60字節(jié)的缺點是有時可能不夠用畅卓。但這樣做是希望用戶盡量減少開銷。最常用的首部長度就是20字節(jié)(即首部長度為0101)扮超,這時不使用任何選項馁龟。
區(qū)分服務(wù)[8bit]用來獲得更好的服務(wù)。這個字段在舊標準中叫做服務(wù)類型肌稻,但實際上一直沒有被使用過东揣。1998年IETF把這個字段改名為區(qū)分服務(wù)DS(Differentiated Services)专甩。只有在使用區(qū)分服務(wù)時,這個字段才起作用矫限。
總長度[16bit]總長度指首部和數(shù)據(jù)之和的長度孽鸡,單位為字節(jié)。總長度字段為16位辨图,因此數(shù)據(jù)報的最大長度為65535字節(jié)凑阶。注:在IP層下面的每一種數(shù)據(jù)鏈路層都有自己的幀格式,其中包括幀格式中的數(shù)據(jù)字段的最大長度的烁,這稱為最大傳送單元MTU(Maximum Transfer Unit)。當一個數(shù)據(jù)報封裝成鏈路層的幀時摄闸,此數(shù)據(jù)報的總長度(即首部加上數(shù)據(jù)部分)一定不能超過下面的數(shù)據(jù)鏈路層的MTU值。
標識(identification)[16bit]IP軟件在存儲器中維持一個計數(shù)器,每產(chǎn)生一個數(shù)據(jù)報耍缴,計數(shù)器就加1实胸,并將此值賦給標識字段。但這個“標識”并不是序號酪呻,因為IP是無連接服務(wù)阶冈,數(shù)據(jù)報不存在按序接收的問題。當數(shù)據(jù)報由于長度超過網(wǎng)絡(luò)的MTU而必須分片時塑径,這個標識字段的值就被復(fù)制到所有的數(shù)據(jù)報的標識字段中女坑。相同的標識字段的值使分片后的各數(shù)據(jù)報片最后能正確地重裝成為原來的數(shù)據(jù)報。
標志(flag)[3bit]占3位统舀,但目前只有2位有意義匆骗。標志字段中的最低位記為MF(More Fragment)劳景。MF=1即表示后面“還有分片”的數(shù)據(jù)報。MF=0表示這已是若干數(shù)據(jù)報片中的最后一個碉就;標志字段中間的一位記為DF(Don’t Fragment)盟广,意思是“不能分片”。只有當DF=0時才允許分片铝噩。
片偏移[13bit]片偏移指出:較長的分組在分片后衡蚂,某片在原分組中的相對位置。也就是說骏庸,相對用戶數(shù)據(jù)字段的起點毛甲,該片從何處開始。片偏移以8個字節(jié)為偏移單位具被。這就是說玻募,每個分片的長度一定是8字節(jié)(64位)的整數(shù)倍。
生存時間[8bit]生存時間字段常用的的英文縮寫是TTL(Time To Live)一姿,表明是數(shù)據(jù)報在網(wǎng)絡(luò)中的壽命七咧。由發(fā)出數(shù)據(jù)報的源點設(shè)置這個字段。其目的是防止無法交付的數(shù)據(jù)報無限制地在因特網(wǎng)中兜圈子叮叹,因而白白消耗網(wǎng)絡(luò)資源艾栋。最初的設(shè)計是以秒作為TTL的單位。每經(jīng)過一個路由器時蛉顽,就把TTL減去數(shù)據(jù)報在路由器消耗掉的一段時間蝗砾。若數(shù)據(jù)報在路由器消耗的時間小于1秒,就把TTL值減1携冤。當TTL值為0時悼粮,就丟棄這個數(shù)據(jù)報。
協(xié)議[8bit]協(xié)議字段指出此數(shù)據(jù)報攜帶的數(shù)據(jù)是使用何種協(xié)議曾棕,以便使目的主機的IP層知道應(yīng)將數(shù)據(jù)部分上交給哪個處理過程扣猫。
首部檢驗和[16bit]這個字段只檢驗數(shù)據(jù)報的首部,但不包括數(shù)據(jù)部分翘地。這是因為數(shù)據(jù)報每經(jīng)過一個路由器申尤,路由器都要重新計算一下首部檢驗和(一些字段,如生存時間子眶、標志瀑凝、片偏移等都可能發(fā)生變化),不檢驗數(shù)據(jù)部分可減少計算的工作量臭杰。
源IP地址[32bit]
目的IP地址[32bit]
- TCP協(xié)議
TCP協(xié)議是面向連接粤咪、保證高可靠性(數(shù)據(jù)無丟失、數(shù)據(jù)無失序渴杆、數(shù)據(jù)無錯誤寥枝、數(shù)據(jù)無重復(fù)到達)傳輸層協(xié)議宪塔。
其協(xié)議頭解釋如下:
端口號[16bit]在TCP頭中,有源端口號(Source Port)和目標端口號(Destination Port)囊拜。源端口號標識了發(fā)送主機的進程,目標端口號標識接收方主機的進程某筐。
序號[32bit]序號分為發(fā)送序號(Sequence Number)和確認序號(Acknowledgment Number)。發(fā)送序號:用來標識從TCP源端向TCP目的端發(fā)送的數(shù)據(jù)字節(jié)流冠跷,它表示在這個報文段中的第一個數(shù)據(jù)字節(jié)的順序號南誊。確認序號:包含發(fā)送確認的一端所期望收到的下一個順序號。因此蜜托,確認序號應(yīng)當是上次已成功收到數(shù)據(jù)字節(jié)順序號加1抄囚。只有ACK標志為1時確認序號字段才有效。TCP為應(yīng)用層提供全雙工服務(wù)橄务,這意味數(shù)據(jù)能在兩個方向上獨立地進行傳輸幔托。因此,連接的每一端必須保持每個方向上的傳輸數(shù)據(jù)順序號蜂挪。
偏移[4bit]這里的偏移實際指的是TCP首部的長度重挑,它用來表明TCP首部中32bit字的數(shù)目,通過它可以知道一個TCP包它的用戶數(shù)據(jù)是從哪里開始的棠涮。
Reserved [6bit]目前沒有使用谬哀,它的值都為0
標志[6bit]在TCP首部中有6個標志位,可同時被置為1严肪,代表意思如下:URG:緊急指針(urgent pointer)有效ACK:確認序號有效PSH:指示接收方應(yīng)該盡快將這個報文段交給應(yīng)用層而不用等待緩沖區(qū)裝滿RST:一般表示斷開一個連接SYN:同步序號用來發(fā)起一個連接FIN:發(fā)送端完成發(fā)送任務(wù)(即斷開連接)
窗口大小(window)[16bit]窗口的大小玻粪,表示源方法最多能接收的字節(jié)數(shù)。
校驗和[16bit]校驗和覆蓋了整個的TCP報文段:TCP首部和TCP數(shù)據(jù)诬垂。這是一個強制性的字段,一定是由發(fā)端計算和存儲伦仍,并由接收端進行驗證结窘。
緊急指針[16bit]只有當URG標志置為1時緊急指針才有效。緊急指針是一個正的偏移量充蓝,和序號字段中的值相加表示緊急數(shù)據(jù)最后一個字節(jié)的序號隧枫。TCP的緊急方式是發(fā)送端向另一端發(fā)送緊急數(shù)據(jù)的一種方式。
TCP選項是可選的
- UDP協(xié)議
傳輸層協(xié)議谓苟,用戶數(shù)據(jù)報協(xié)議官脓,不可靠的協(xié)議,只負責(zé)把應(yīng)用層的協(xié)議的數(shù)據(jù)傳送到IP層的數(shù)據(jù)報涝焙,而不管數(shù)據(jù)是否到達卑笨。它的協(xié)議頭比較簡單,如下:
端口號[16bit]與TCP一樣仑撞,也有源端口號(Source Port)和目標端口號(Destination Port)赤兴。源端口號標識了發(fā)送主機的進程,目標端口號標識接收方主機的進程妖滔。
Length[16bit]標識UDP頭的長度。
Checksum[16bit]校驗和桶良,包含UDP頭和數(shù)據(jù)部分座舍。
- HTTP協(xié)議
1、定義HTTP全稱是HyperText Transfer Protocal陨帆,即:超文本傳輸協(xié)議曲秉,從1990年開始就在WWW上廣泛應(yīng)用,是現(xiàn)今在WWW上應(yīng)用最多的協(xié)議疲牵,HTTP是應(yīng)用層協(xié)議承二,并且HTTP協(xié)議是基于TCP連接的,主要解決的是如何包裝協(xié)議的瑰步。當你上網(wǎng)瀏覽網(wǎng)頁的時候矢洲,瀏覽器和Web服務(wù)器之間就會通過HTTP在Internet上進行數(shù)據(jù)的發(fā)送和接收。HTTP是一個基于請求/響應(yīng)模式的缩焦、無狀態(tài)的協(xié)議读虏。即我們通常所說的Request/Response。
2袁滥、URL解析URL(Uniform Resource Locator:統(tǒng)一資源定位符)地址用于描述一個網(wǎng)絡(luò)上的資源, 基本格式如下:schema://host[:port#]/path/…/[?query-string][#anchor]
- scheme:指定底層使用的協(xié)議(例如:http,https,ftp)盖桥;
- host:HTTP服務(wù)器的IP地址或者域名;
- port:HTTP服務(wù)器的默認端口是80题翻,這種情況下端口號可以省略揩徊,如果使用了別的端口,必須指明嵌赠,例如http://www.xiaoyaoyou1212.com:8080/塑荒;
- path:訪問資源的路徑;
- query-string:發(fā)送給HTTP服務(wù)器的數(shù)據(jù)姜挺;
- anchor:錨齿税。
URL的一個例子:http://www.mywebsite.com/sj/test/test.aspx?name=sviergn&x=true#stuff
描述
示例
描述 | 示例 |
---|---|
Schema | http |
Host | www.mywebsite.com |
Path | /sj/test/test.aspx |
Query String | name=sviergn&x=true |
Anchor | stuff |
作者:larryzhao
鏈接:http://www.reibang.com/p/sTeAbC
來源:簡書
著作權(quán)歸作者所有。商業(yè)轉(zhuǎn)載請聯(lián)系作者獲得授權(quán)炊豪,非商業(yè)轉(zhuǎn)載請注明出處凌箕。
3、HTTP的Request消息的結(jié)構(gòu)Request消息分為3部分:Request line,Request header,body.header和body之間有個空行词渤。
Method表示請求方法牵舱,比如”POST”,”GET”等。
Path-to-resoure表示請求的資源
Http/version-number表示HTTP協(xié)議的版本號注:當使用的是”GET”方法的時候缺虐,body是為空的芜壁,比如我們打開CSDN博客首頁的request如下:
12
GET http://www.cnblogs.com HTTP/1.1Host: blog.csdn.net
Accept作用:表示瀏覽器端可以接受的媒體類型例如:Accept:text/html,代表瀏覽器可以接受服務(wù)器回發(fā)的類型為text/html,也就是我們常說的html文檔沿盅,如果服務(wù)器無法返回text/html類型的數(shù)據(jù)把篓,服務(wù)器應(yīng)該返回一個406錯誤(non acceptable);通配符代表任意類型腰涧,例如Accept:/*代表瀏覽器可以處理所有類型(一般瀏覽器發(fā)給服務(wù)器都是發(fā)這個)韧掩。
Referer作用:提供了Request的上下文信息的服務(wù)器,告訴服務(wù)器我是從哪個鏈接過來的窖铡,比如從我主頁上鏈接到一個朋友那里疗锐,他的服務(wù)器就能夠從HTTP Referer中統(tǒng)計出每天有多少用戶點擊我主頁上的鏈接訪問他的網(wǎng)站。例如:Referer:http://blog.csdn.net/xiaoyaoyou1212
Accept-Language作用:瀏覽器申明自己接收的語言注:語言跟字符集的區(qū)別:中文是語言费彼,中文有多種字符集滑臊,比如big5,gb2312箍铲,gbk等等例如:Accept-Language: en-us
Content-Type作用:指定不同格式的請求信息例如:Content-Type: application/x-www-form-urlencoded
Accept-Encoding:作用:瀏覽器申明自己接收的編碼方法雇卷,通常指定壓縮方法,是否支持壓縮颠猴,支持什么壓縮方法(gzip关划,deflate)(注意:這不是指字符編碼);例如: Accept-Encoding: gzip, deflate
User-Agent作用:告訴HTTP服務(wù)器,客戶端使用的操作系統(tǒng)和瀏覽器的名稱和版本例如:User-Agent: Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0; CIBA; .NET CLR 2.0.50727; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729; .NET4.0C; InfoPath.2; .NET4.0E)
Connection作用:表示網(wǎng)頁下次打開時是否需要重新建立連接例如:Connection:keep-alive翘瓮,當一個網(wǎng)頁打開完成后贮折,客戶端和服務(wù)器之間用于傳輸HTTP數(shù)據(jù)的TCP連接不會關(guān)閉,如果客戶端再次訪問這個服務(wù)器上的網(wǎng)頁资盅,會繼續(xù)使用這一條已經(jīng)建立的連接调榄;Connection: close,代表一個Request完成后呵扛,客戶端和服務(wù)器之間用于傳輸HTTP數(shù)據(jù)的TCP連接會關(guān)閉每庆,當客戶端再次發(fā)送Request,需要重新建立TCP連接今穿。
Content-Length作用:表示發(fā)送給HTTP服務(wù)器數(shù)據(jù)的長度例如:Content-Length: 38
Host(發(fā)送請求時扣孟,該報頭域是必需的)作用:請求報頭域主要用于指定被請求資源的Internet主機和端口號,它通常從HTTP URL中提取出來的例如:在瀏覽器中輸入:http://blog.csdn.net/xiaoyaoyou1212荣赶,瀏覽器發(fā)送的請求消息中,就會包含Host請求報頭域Host:http://blog.csdn.net/xiaoyaoyou1212
鸽斟,此處使用缺省端口號80拔创,若指定了端口號,則變成:Host:指定端口號
Pragma作用:防止頁面被緩存富蓄,在HTTP/1.1版本中剩燥,它和Cache-Control:no-cache作用一模一樣例如:Pragma: no-cache
Cookie作用:最重要的header, 將cookie的值發(fā)送給HTTP服務(wù)器
Accept-Charset作用:瀏覽器申明自己接收的字符集,這就是本文前面介紹的各種字符集和字符編碼,如gb2312灭红,utf-8(通常我們說Charset包括了相應(yīng)的字符編碼方案)
4侣滩、HTTP的Response消息的結(jié)構(gòu)Response消息分為3部分:Response line,Response header,body.header和body之間有個空行。
HTTP/version-number表示HTTP協(xié)議的版本號
Status-code表示響應(yīng)碼变擒,如200君珠、404、500等
Message狀態(tài)信息描述
Cache-Control作用: 這個是非常重要的規(guī)則娇斑,用來指定Response-Request遵循的緩存機制策添。各個指令含義如下:
Cache-directive | 說明 |
---|---|
public | 所有內(nèi)容都將被緩存(客戶端和代理服務(wù)器都可緩存) |
private | 內(nèi)容只緩存到私有緩存中(僅客戶端可以緩存,代理服務(wù)器不可緩存) |
no-cache | 必須先與服務(wù)器確認返回的響應(yīng)是否被更改毫缆,然后才能使用該響應(yīng)來滿足后續(xù)對同一個網(wǎng)址的請求唯竹。因此,如果存在合適的驗證令牌 (ETag)苦丁,no-cache 會發(fā)起往返通信來驗證緩存的響應(yīng)浸颓,如果資源未被更改,可以避免下載旺拉。 |
no-store | 所有內(nèi)容都不會被緩存到緩存或 Internet 臨時文件中 |
must-revalidation/proxy-revalidation | 如果緩存的內(nèi)容失效产上,請求必須發(fā)送到服務(wù)器/代理以進行重新驗證 |
max-age=xxx (xxx is numeric) | 緩存的內(nèi)容將在 xxx 秒后失效, 這個選項只在HTTP 1.1可用, 并如果和Last-Modified一起使用時, 優(yōu)先級較高 |
Content-Type作用:WEB服務(wù)器告訴瀏覽器自己響應(yīng)的對象的類型和字符集例如:
123
Content-Type: text/html; charset=utf-8
Content-Type: text/html; charset=GB2312
Content-Type: image/jpeg
Expires作用:瀏覽器會在指定過期時間內(nèi)使用本地緩存例如:Expires: Tue, 08 Feb 2022 12:00:00 GMT
Last-Modified作用:用于指示資源的最后修改日期和時間例如:Last-Modified: Wed, 21 Dec 2011 12:00:00 GMT
Server作用:指明HTTP服務(wù)器的軟件信息例如:Server: Microsoft-IIS/7.5
X-AspNet-Version作用:如果網(wǎng)站是用ASP.NET開發(fā)的,這個header用來表示ASP.NET的版本例如: X-> AspNet-Version: 4.0.30319
X-Powered-By作用:表示網(wǎng)站是用什么技術(shù)開發(fā)的例如:X-Powered-By: ASP.NET
Connection作用:表示網(wǎng)頁下次打開時是否需要重新建立連接例如:Connection: keep-alive账阻,當一個網(wǎng)頁打開完成后蒂秘,客戶端和服務(wù)器之間用于傳輸HTTP數(shù)據(jù)的TCP連接不會關(guān)閉,如果客戶端再次訪問這個服務(wù)器上的網(wǎng)頁淘太,會繼續(xù)使用這一條已經(jīng)建立的連接姻僧;Connection: close,代表一個Request完成后蒲牧,客戶端和服務(wù)器之間用于傳輸HTTP數(shù)據(jù)的TCP連接會關(guān)閉撇贺, 當客戶端再次發(fā)送Request,需要重新建立TCP連接冰抢。
Content-Length作用:指明實體正文的長度松嘶,以字節(jié)方式存儲的十進制數(shù)字來表示。在數(shù)據(jù)下行的過程中挎扰,Content-Length的方式要預(yù)先在服務(wù)器中緩存所有數(shù)據(jù)翠订,然后所有數(shù)據(jù)再一起發(fā)給客戶端。例如:Content-Length: 19847
Date作用:生成消息的具體時間和日期例如:Date: Sat, 11 Feb 2012 12:00:00 GMT
5遵倦、HTTP協(xié)議之GET和POSTHTTP協(xié)議定義了很多與服務(wù)器交互的方法尽超,最基本的有4種,分別是GET,POST,PUT,DELETE梧躺。一個URL地址用于描述一個網(wǎng)絡(luò)上的資源似谁,而HTTP中的GET,POST,PUT,DELETE就對應(yīng)著對這個資源的查、改、增巩踏、刪4個操作秃诵。最常見的就是GET和POST,GET一般用于獲取/查詢資源信息塞琼,而POST一般用于更新資源信息菠净。其區(qū)別如下:
GET提交的數(shù)據(jù)會放在URL之后,以?分割URL和傳輸數(shù)據(jù)屈梁,參數(shù)之間以&相連嗤练,如EditPosts.aspx?name=test&id=123456
,POST方法是把提交的數(shù)據(jù)放在HTTP包的Body中在讶;
GET提交的數(shù)據(jù)大小有限制(因為瀏覽器對URL的長度有限制)煞抬,而POST方法提交的數(shù)據(jù)沒有限制;
GET方式需要使用Request.QueryString來取得變量的值构哺,而POST方式通過Request.Form來獲取變量的值革答,也就是說GET是通過地址欄來傳值,而POST是通過提交表單來傳值曙强;
GET方式提交數(shù)據(jù)残拐,會帶來安全問題,比如一個登錄頁面碟嘴,通過GET方式提交數(shù)據(jù)時溪食,用戶名和密碼將出現(xiàn)在URL上,如果頁面可以被緩存或者其他人可以訪問這臺機器娜扇,就可以從歷史記錄獲得該用戶的賬號和密碼错沃。
示例
- TCP
public static void sendData(byte[] data) throws IOException {
if (data == null) {
return;
}
Socket socket = new Socket(InetAddress.getByName("192.168.1.122"), 9999);
OutputStream outputstream = socket.getOutputStream();
outputstream.write(data, 0, data.length);
outputstream.close();
socket.close();
}
public static void receiveData() throws IOException {
ServerSocket serversocket = new ServerSocket(9999);
Socket socket = serversocket.accept();
InputStream inputstream = socket.getInputStream();
byte[] buffer = new byte[1024];
int bytes = inputstream.read(buffer);
byte[] data = new byte[bytes];
System.arraycopy(buffer, 0, data, 0, data.length);
Log.i("XYY", new String(data));
inputstream.close();
socket.close();
serversocket.close();
}
- 調(diào)用如下:
new Thread(new Runnable() {
@Override
public void run() {
try {
TCP.receiveData();
TCP.sendData("逍遙游".getBytes());
} catch (IOException e) {
e.printStackTrace();
}
}
}).start();
- UDP
public static void sendData(byte[] data) throws IOException {
if (data == null) {
return;
}
DatagramSocket datagramSocket = new DatagramSocket();
DatagramPacket datagramPacket = new DatagramPacket(data, data.length, InetAddress.getByName("192.168.1.122"), 9999);
datagramSocket.send(datagramPacket);
datagramSocket.close();
}
public static void receiveData() throws IOException {
DatagramSocket datagramSocket = new DatagramSocket(9999);
byte[] receive = new byte[1024];
DatagramPacket datagramPacket = new DatagramPacket(receive, receive.length);
datagramSocket.receive(datagramPacket);
Log.i("XYY", new String(receive, 0, datagramPacket.getLength()));
datagramSocket.close();
}
- 調(diào)用如下:
new Thread(new Runnable() {
@Override
public void run() {
try {
UDP.receiveData();
UDP.sendData("逍遙游".getBytes());
} catch (IOException e) {
e.printStackTrace();
}
}
}).start();