網(wǎng)絡協(xié)議學習筆記

定義

網(wǎng)絡協(xié)議為計算機網(wǎng)絡中進行數(shù)據(jù)交換而建立的規(guī)則、標準或約定的集合。網(wǎng)絡協(xié)議主要由三個要素組成:語義、語法及時序;語義表示要做什么,語法表示要怎么做,時序表示做的順序。網(wǎng)絡協(xié)議是網(wǎng)絡上所有設備(網(wǎng)絡服務器、計算機、交換機、路由器、防火墻等)之間通信規(guī)則的集合,它規(guī)定了通信時信息必須采用的格式和這些格式的意義。由于網(wǎng)絡節(jié)點之間聯(lián)系的復雜性,在制定協(xié)議時,通常把復雜成分分解成一些簡單成分,然后再將它們復合起來。最常用的復合技術就是層次方式,網(wǎng)絡協(xié)議的層次結構如下:(1)結構中的每一層都規(guī)定有明確的服務及接口標準。(2)把用戶的應用程序作為最高層。(3)除了最高層外,中間的每一層都向上一層提供服務,同時又是下一層的用戶。(4)把物理通信線路作為最低層,它使用從最高層傳送來的參數(shù),是提供服務的基礎。

分層詳情

為了使不同計算機廠家生產(chǎn)的計算機能夠相互通信,以便在更大的范圍內(nèi)建立計算機網(wǎng)絡,國際標準化組織(ISO)在1978年提出了“開放系統(tǒng)互聯(lián)參考模型”,即著名的OSI/RM模型(Open System Interconnection/Reference Model)。它將計算機網(wǎng)絡體系結構的通信協(xié)議劃分為七層,自下而上依次為:物理層(Physics Layer)、數(shù)據(jù)鏈路層(Data Link Layer)、網(wǎng)絡層(Network Layer)、傳輸層(Transport Layer)、會話層(Session Layer)、表示層(Presentation Layer)、應用層(Application Layer)。其中第四層完成數(shù)據(jù)傳送服務,上面三層面向用戶。對于每一層,至少制定兩項標準:服務定義和協(xié)議規(guī)范。前者給出了該層所提供的服務的準確定義,后者詳細描述了該協(xié)議的動作和各種有關規(guī)程,以保證服務的提供。以下為各層詳細介紹:第一層:物理層規(guī)定通信設備的機械的、電氣的、功能的和過程的特性,用以建立、維護和拆除物理鏈路連接。具體地講,機械 特性規(guī)定了網(wǎng)絡連接時所需接插件的規(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、光導纖維、同軸電纜、雙絞線等。
第二層:數(shù)據(jù)鏈路層在物理層提供比特流服務的基礎上,建立相鄰結點之間的數(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)絡層在計算機網(wǎng)絡中進行通信的兩個計算機之間可能會經(jīng)過很多個數(shù)據(jù)鏈路,也可能還要經(jīng)過很多通信子網(wǎng)。網(wǎng)絡層的任務就是選擇合適的網(wǎng)間路由和交換結點, 確保數(shù)據(jù)及時傳送。網(wǎng)絡層將數(shù)據(jù)鏈路層提供的幀組成數(shù)據(jù)包,包中封裝有網(wǎng)絡層包頭,其中含有邏輯地址信息–源站點和目的站點地址的網(wǎng)絡地址。如果你在談論一個IP地址,那么你是在處理第三層的問題,這是“數(shù)據(jù)包”問題,而不是第二層的“幀”。IP是第三層問題的一部分,此外還有一些路由協(xié)議和地址解析協(xié)議(ARP)。有關路由的一切事情都在這第三層處理。地址解析和路由是三層的重要目的。網(wǎng)絡層還可以實現(xiàn)擁塞控制、網(wǎng)際互連等功能。在這一層,數(shù)據(jù)的單位稱為數(shù)據(jù)包(packet)。網(wǎng)絡層的協(xié)議包括:IP(IPv4、IPv6)、ICMP、ICMPv6、IGMP、IS-IS、IPsec、ARP、RARP等。
第四層:傳輸層第4層的數(shù)據(jù)單元也稱作數(shù)據(jù)包(packets)。但是,當你談論TCP等具體的協(xié)議時又有特殊的叫法,TCP的數(shù)據(jù)單元稱為段 (segments)而UDP協(xié)議的數(shù)據(jù)單元稱為“數(shù)據(jù)報(datagrams)”。這個層負責獲取全部信息,因此,它必須跟蹤數(shù)據(jù)單元碎片、亂序到達的 數(shù)據(jù)包和其它在傳輸過程中可能發(fā)生的危險。第4層為上層提供端到端(最終用戶到最終用戶)的透明的、可靠的數(shù)據(jù)傳輸服務。所為透明的傳輸是指在通信過程中 傳輸層對上層屏蔽了通信傳輸系統(tǒng)的具體細節(jié)。傳輸層的協(xié)議包括:TCP、UDP、TLS、DCCP、SCTP、RSVP、OSPF等。
第五層:會話層這一層也可以稱為會晤層或對話層,在會話層及以上的高層次中,數(shù)據(jù)傳送的單位不再另外命名,而是統(tǒng)稱為報文。會話層不參與具體的傳輸,它提供包括訪問驗證和會話管理在內(nèi)的建立和維護應用之間通信的機制。如服務器驗證用戶登錄便是由會話層完成的。
第六層:表示層這一層主要解決擁護信息的語法表示問題。它將欲交換的數(shù)據(jù)從適合于某一用戶的抽象語法,轉換為適合于OSI系統(tǒng)內(nèi)部使用的傳送語法。即提供格式化的表示和轉換數(shù)據(jù)服務。數(shù)據(jù)的壓縮和解壓縮, 加密和解密等工作都由表示層負責。
第七層:應用層應用層為操作系統(tǒng)或網(wǎng)絡應用程序提供訪問網(wǎ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)絡通信的基本操作單元。它是網(wǎng)絡通信過程中端點的抽象表示,包含進行網(wǎng)絡通信必須的五種信息:連接使用的協(xié)議,本地主機的IP地址,本地進程的協(xié)議端口,遠地主機的IP地址,遠地進程的協(xié)議端口。
  • TCP連接
    TCP連接包含三次握手過程,其過程介紹如下:第一次握手:客戶端發(fā)送syn包(syn=j)到服務器,并進入SYN_SEND狀態(tài),等待服務器確認;第二次握手:服務器收到syn包,必須確認客戶的SYN(ack=j+1),同時自己也發(fā)送一個SYN包(syn=k),即SYN+ACK包,此時服務器進入SYN_RECV狀態(tài);第三次握手:客戶端收到服務器的SYN+ACK包,向服務器發(fā)送確認包ACK(ack=k+1),此包發(fā)送完畢,客戶端和服務器進入ESTABLISHED狀態(tài),完成三次握手。握手過程中傳送的包里不包含數(shù)據(jù),三次握手完畢后,客戶端與服務器才正式開始傳送數(shù)據(jù)。理想狀態(tài)下,TCP連接一旦建立,在通信雙方中的任何一方主動關閉連接之前,TCP連接都將被一直保持下去。斷開連接時服務器和客戶端均可以主動發(fā)起斷開TCP連接的請求,斷開過程需要經(jīng)過“四次握手”。
  • Socket連接
    由于通常情況下Socket連接就是TCP連接,因此Socket連接一旦建立,通信雙方即可開始相互發(fā)送數(shù)據(jù)內(nèi)容,直到雙方連接斷開。但在實際網(wǎng)絡應用中,客戶端到服務器之間的通信往往需要穿越多個中間節(jié)點,例如路由器、網(wǎng)關、防火墻等,大部分防火墻默認會關閉長時間處于非活躍狀態(tài)的連接而導致 Socket連接斷連,因此需要通過輪詢告訴網(wǎng)絡,該連接處于活躍狀態(tài)。建立Socket連接至少需要一對套接字,其中一個運行于客戶端,稱為ClientSocket ,另一個運行于服務器端,稱為ServerSocket。套接字之間的連接過程分為三個步驟:服務器監(jiān)聽,客戶端請求,連接確認。1、服務器監(jiān)聽:服務器端套接字并不定位具體的客戶端套接字,而是處于等待連接的狀態(tài),實時監(jiān)控網(wǎng)絡狀態(tài),等待客戶端的連接請求。2、客戶端請求:指客戶端的套接字提出連接請求,要連接的目標是服務器端的套接字。為此,客戶端的套接字必須首先描述它要連接的服務器的套接字,指出服務器端套接字的地址和端口號,然后就向服務器端套接字提出連接請求。3、連接確認:當服務器端套接字監(jiān)聽到或者說接收到客戶端套接字的連接請求時,就響應客戶端套接字的請求,建立一個新的線程,把服務器端套接字的描述發(fā)給客戶端,一旦客戶端確認了此描述,雙方就正式建立連接。而服務器端套接字繼續(xù)處于監(jiān)聽狀態(tài),繼續(xù)接收其他客戶端套接字的連接請求。
  • HTTP連接
    HTTP協(xié)議是建立在TCP協(xié)議之上的一種應用,HTTP連接使用的是“請求—響應”的方式,不僅在請求時需要先建立連接,而且需要客戶端向服務器發(fā)出請求后,服務器端才能回復數(shù)據(jù)。在請求結束后,會主動釋放連接。從建立連接到關閉連接的過程稱為“一次連接”。由于HTTP在每次請求結束后都會主動釋放連接,因此HTTP連接是一種“短連接”,要保持客戶端程序的在線狀態(tài),需要不斷地向服務器發(fā)起連接請求。通常的做法是即時不需要獲得任何數(shù)據(jù),客戶端也保持每隔一段固定的時間向服務器發(fā)送一次“保持連接”的請求,服務器在收到該請求后對客戶端進行回復,表明知道客戶端“在線”。若服務器長時間無法收到客戶端的請求,則認為客戶端“下線”,若客戶端長時間無法收到服務器的回復,則認為網(wǎng)絡已經(jīng)斷開。
  • TCP/IP協(xié)議和HTTP協(xié)議之間的關系
    TPC/IP協(xié)議是傳輸層協(xié)議,主要解決數(shù)據(jù)如何在網(wǎng)絡中傳輸,而HTTP是應用層協(xié)議,主要解決如何包裝數(shù)據(jù)。實際上HTTP協(xié)議就是建立在TCP/IP協(xié)議之上的。
  • Socket和TCP/IP協(xié)議之間的關系
    TCP/IP只是一個協(xié)議棧,就像操作系統(tǒng)的運行機制一樣,必須要具體實現(xiàn),同時還要提供對外的操作接口。這個就像操作系統(tǒng)會提供標準的編程接口,比如win32編程接口一樣,TCP/IP也要提供可供程序員做網(wǎng)絡開發(fā)所用的接口,這就是Socket編程接口。
  • TCP/IP協(xié)議,HTTP協(xié)議,Socket三者之間的關系
    實際上,傳輸層的TCP是基于網(wǎng)絡層的IP協(xié)議的,而應用層的HTTP協(xié)議又是基于傳輸層的TCP協(xié)議的,而Socket本身不算是協(xié)議,它只是提供了一個針對TCP或者UDP編程的接口。
  • TCP協(xié)議
    傳輸控制協(xié)議,提供的是面向連接、可靠的字節(jié)流服務。當客戶和服務器彼此交換數(shù)據(jù)前,必須先在雙方之間建立一個TCP連接,之后才能傳輸數(shù)據(jù)。TCP提供超時重發(fā),丟棄重復數(shù)據(jù),檢驗數(shù)據(jù),流量控制等功能,保證數(shù)據(jù)能從一端傳到另一端。
  • UDP協(xié)議
    用戶數(shù)據(jù)報協(xié)議,是一個無連接的簡單的面向數(shù)據(jù)報的傳輸層協(xié)議。UDP不提供可靠性,它只是把應用程序傳給IP層的數(shù)據(jù)報發(fā)送出去,但是并不能保證它們能到達目的地。由于UDP在傳輸數(shù)據(jù)報前不用在客戶和服務器之間建立一個連接,且沒有超時重發(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è)務,比如語音廣播、視頻、QQ、TFTP(簡單文件傳送)、SNMP(簡單網(wǎng)絡管理協(xié)議)、RTP(實時傳送協(xié)議)RIP(路由信息協(xié)議,如報告股票市場,航空信息)、DNS(域名解釋)。注重速度流暢。
  • FTP協(xié)議
    文件傳輸協(xié)議(File Transfer Protocol, FTP)是TCP/IP網(wǎng)絡上兩臺計算機傳送文件的協(xié)議,F(xiàn)TP是在TCP/IP網(wǎng)絡和INTERNET上最早使用的協(xié)議之一,它屬于網(wǎng)絡協(xié)議組的應用層。FTP客戶機可以給服務器發(fā)出命令來下載文件,上載文件,創(chuàng)建或改變服務器上的目錄。

協(xié)議詳解

  • IP協(xié)議
    IP協(xié)議是TCP/IP協(xié)議簇中的核心協(xié)議,也是TCP/IP的載體。所有的TCP,UDP,ICMP及IGMP數(shù)據(jù)都以IP數(shù)據(jù)報格式傳輸。IP提供不可靠的,無連接的數(shù)據(jù)傳送服務。不可靠指它不能保證IP數(shù)據(jù)報能成功到達目的地。IP僅提供最好的傳輸服務。當發(fā)生某種錯誤時,如某個路由器暫時用完了緩沖區(qū),IP有一個簡單的錯誤處理算法:丟棄該數(shù)據(jù)報,然后發(fā)送ICMP消息給信源。任何要求的可靠性必須由上層來提供。無連接指IP并不維護任何關于后續(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負責選擇傳送的道路,這種選擇道路稱為路由功能。如果有些網(wǎng)絡內(nèi)只能傳送小數(shù)據(jù)報,IP可以將數(shù)據(jù)報重新組裝并在報頭域內(nèi)注明。IP模塊中包括這些基本功能,這些模塊存在于網(wǎng)絡中的每臺主機和網(wǎng)關上,而且這些模塊(特別在網(wǎng)關上)有路由選擇和其它服務功能。對IP來說,數(shù)據(jù)報之間沒有什么聯(lián)系,對IP不好說什么連接或邏輯鏈路。IP使用四個關鍵技術提供服務:服務類型,生存時間,選項和報頭校驗碼。服務類型指希望得到的服務質(zhì)量,服務類型是一個參數(shù)集,這些參數(shù)是Internet能夠提供服務的代表,這種服務類型由網(wǎng)關使用,用于在特定的網(wǎng)絡,或是用于下下一個要經(jīng)過的網(wǎng)絡,或是下一個要對這個數(shù)據(jù)報進行路由的網(wǎng)關上選擇實際的傳送參數(shù)。生存時間是數(shù)據(jù)報可以生存的時間上限,它由發(fā)送者設置,由經(jīng)過路由的地方處理,如果未到達時生存時間為零,拋棄此數(shù)據(jù)報。對于控制函數(shù)來說選項是重要的,但對于通常的通信來說它沒有存在的必要,選項包括時間戳,安全和特殊路由。報頭校驗碼保證數(shù)據(jù)的正確傳輸,如果校驗出錯,拋棄整個數(shù)據(jù)報。其協(xié)議頭解釋如下:
    IP協(xié)議頭

版本[4bit]指IP協(xié)議的版本。通信雙方使用的IP協(xié)議版本必須一致。目前廣泛使用的IP協(xié)議版本號為4(即IPv4)。關于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ū)分服務[8bit]用來獲得更好的服務。這個字段在舊標準中叫做服務類型,但實際上一直沒有被使用過。1998年IETF把這個字段改名為區(qū)分服務DS(Differentiated Services)。只有在使用區(qū)分服務時,這個字段才起作用。

總長度[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是無連接服務,數(shù)據(jù)報不存在按序接收的問題。當數(shù)據(jù)報由于長度超過網(wǎng)絡的MTU而必須分片時,這個標識字段的值就被復制到所有的數(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)絡中的壽命。由發(fā)出數(shù)據(jù)報的源點設置這個字段。其目的是防止無法交付的數(shù)據(jù)報無限制地在因特網(wǎng)中兜圈子,因而白白消耗網(wǎng)絡資源。最初的設計是以秒作為TTL的單位。每經(jīng)過一個路由器時,就把TTL減去數(shù)據(jù)報在路由器消耗掉的一段時間。若數(shù)據(jù)報在路由器消耗的時間小于1秒,就把TTL值減1。當TTL值為0時,就丟棄這個數(shù)據(jù)報。

協(xié)議[8bit]協(xié)議字段指出此數(shù)據(jù)報攜帶的數(shù)據(jù)是使用何種協(xié)議,以便使目的主機的IP層知道應將數(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ù)無重復到達)傳輸層協(xié)議。
    其協(xié)議頭解釋如下:
    TCP協(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ā)送確認的一端所期望收到的下一個順序號。因此,確認序號應當是上次已成功收到數(shù)據(jù)字節(jié)順序號加1。只有ACK標志為1時確認序號字段才有效。TCP為應用層提供全雙工服務,這意味數(shù)據(jù)能在兩個方向上獨立地進行傳輸。因此,連接的每一端必須保持每個方向上的傳輸數(shù)據(jù)順序號。

偏移[4bit]這里的偏移實際指的是TCP首部的長度,它用來表明TCP首部中32bit字的數(shù)目,通過它可以知道一個TCP包它的用戶數(shù)據(jù)是從哪里開始的。

Reserved [6bit]目前沒有使用,它的值都為0

標志[6bit]在TCP首部中有6個標志位,可同時被置為1,代表意思如下:URG:緊急指針(urgent pointer)有效ACK:確認序號有效PSH:指示接收方應該盡快將這個報文段交給應用層而不用等待緩沖區(qū)裝滿RST:一般表示斷開一個連接SYN:同步序號用來發(fā)起一個連接FIN:發(fā)送端完成發(fā)送任務(即斷開連接)

窗口大小(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é)議,只負責把應用層的協(xié)議的數(shù)據(jù)傳送到IP層的數(shù)據(jù)報,而不管數(shù)據(jù)是否到達。它的協(xié)議頭比較簡單,如下:
    UDP協(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上廣泛應用,是現(xiàn)今在WWW上應用最多的協(xié)議,HTTP是應用層協(xié)議,并且HTTP協(xié)議是基于TCP連接的,主要解決的是如何包裝協(xié)議的。當你上網(wǎng)瀏覽網(wǎng)頁的時候,瀏覽器和Web服務器之間就會通過HTTP在Internet上進行數(shù)據(jù)的發(fā)送和接收。HTTP是一個基于請求/響應模式的、無狀態(tài)的協(xié)議。即我們通常所說的Request/Response。
2、URL解析URL(Uniform Resource Locator:統(tǒng)一資源定位符)地址用于描述一個網(wǎng)絡上的資源, 基本格式如下:schema://host[:port#]/path/…/[?query-string][#anchor]

  • scheme:指定底層使用的協(xié)議(例如:http,https,ftp);
  • host:HTTP服務器的IP地址或者域名;
  • port:HTTP服務器的默認端口是80,這種情況下端口號可以省略,如果使用了別的端口,必須指明,例如http://www.xiaoyaoyou1212.com:8080/
  • path:訪問資源的路徑;
  • query-string:發(fā)送給HTTP服務器的數(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.lxweimin.com/p/sTeAbC
來源:簡書
著作權歸作者所有。商業(yè)轉載請聯(lián)系作者獲得授權,非商業(yè)轉載請注明出處。

3、HTTP的Request消息的結構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,代表瀏覽器可以接受服務器回發(fā)的類型為text/html,也就是我們常說的html文檔,如果服務器無法返回text/html類型的數(shù)據(jù),服務器應該返回一個406錯誤(non acceptable);通配符代表任意類型,例如Accept:/*代表瀏覽器可以處理所有類型(一般瀏覽器發(fā)給服務器都是發(fā)這個)。

Referer作用:提供了Request的上下文信息的服務器,告訴服務器我是從哪個鏈接過來的,比如從我主頁上鏈接到一個朋友那里,他的服務器就能夠從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服務器,客戶端使用的操作系統(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)頁打開完成后,客戶端和服務器之間用于傳輸HTTP數(shù)據(jù)的TCP連接不會關閉,如果客戶端再次訪問這個服務器上的網(wǎng)頁,會繼續(xù)使用這一條已經(jīng)建立的連接;Connection: close,代表一個Request完成后,客戶端和服務器之間用于傳輸HTTP數(shù)據(jù)的TCP連接會關閉,當客戶端再次發(fā)送Request,需要重新建立TCP連接。

Content-Length作用:表示發(fā)送給HTTP服務器數(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服務器

Accept-Charset作用:瀏覽器申明自己接收的字符集,這就是本文前面介紹的各種字符集和字符編碼,如gb2312,utf-8(通常我們說Charset包括了相應的字符編碼方案)

4、HTTP的Response消息的結構Response消息分為3部分:Response line,Response header,body.header和body之間有個空行。
HTTP/version-number表示HTTP協(xié)議的版本號

Status-code表示響應碼,如200、404、500等

Message狀態(tài)信息描述

Cache-Control作用: 這個是非常重要的規(guī)則,用來指定Response-Request遵循的緩存機制。各個指令含義如下:

Cache-directive 說明
public 所有內(nèi)容都將被緩存(客戶端和代理服務器都可緩存)
private 內(nèi)容只緩存到私有緩存中(僅客戶端可以緩存,代理服務器不可緩存)
no-cache 必須先與服務器確認返回的響應是否被更改,然后才能使用該響應來滿足后續(xù)對同一個網(wǎng)址的請求。因此,如果存在合適的驗證令牌 (ETag),no-cache 會發(fā)起往返通信來驗證緩存的響應,如果資源未被更改,可以避免下載。
no-store 所有內(nèi)容都不會被緩存到緩存或 Internet 臨時文件中
must-revalidation/proxy-revalidation 如果緩存的內(nèi)容失效,請求必須發(fā)送到服務器/代理以進行重新驗證
max-age=xxx (xxx is numeric) 緩存的內(nèi)容將在 xxx 秒后失效, 這個選項只在HTTP 1.1可用, 并如果和Last-Modified一起使用時, 優(yōu)先級較高

Content-Type作用:WEB服務器告訴瀏覽器自己響應的對象的類型和字符集例如:
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服務器的軟件信息例如: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)站是用什么技術開發(fā)的例如:X-Powered-By: ASP.NET

Connection作用:表示網(wǎng)頁下次打開時是否需要重新建立連接例如:Connection: keep-alive,當一個網(wǎng)頁打開完成后,客戶端和服務器之間用于傳輸HTTP數(shù)據(jù)的TCP連接不會關閉,如果客戶端再次訪問這個服務器上的網(wǎng)頁,會繼續(xù)使用這一條已經(jīng)建立的連接;Connection: close,代表一個Request完成后,客戶端和服務器之間用于傳輸HTTP數(shù)據(jù)的TCP連接會關閉, 當客戶端再次發(fā)送Request,需要重新建立TCP連接。

Content-Length作用:指明實體正文的長度,以字節(jié)方式存儲的十進制數(shù)字來表示。在數(shù)據(jù)下行的過程中,Content-Length的方式要預先在服務器中緩存所有數(shù)據(jù),然后所有數(shù)據(jù)再一起發(fā)給客戶端。例如:Content-Length: 19847

Date作用:生成消息的具體時間和日期例如:Date: Sat, 11 Feb 2012 12:00:00 GMT

5、HTTP協(xié)議之GET和POSTHTTP協(xié)議定義了很多與服務器交互的方法,最基本的有4種,分別是GET,POST,PUT,DELETE。一個URL地址用于描述一個網(wǎng)絡上的資源,而HTTP中的GET,POST,PUT,DELETE就對應著對這個資源的查、改、增、刪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();

源地址:http://www.huwei.tech/2016/11/20/%E7%BD%91%E7%BB%9C%E5%8D%8F%E8%AE%AE%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/

最后編輯于
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

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