網路協議學習筆記
定義
網路協議為計算機網路中進行資料交換而建立的規則、標準或約定的集合。
網路協議主要由三個要素組成:語義、語法及時序;語義表示要做什麼,語法表示要怎麼做,時序表示做的順序。
網路協議是網路上所有裝置(網路伺服器、計算機、交換機、路由器、防火牆等)之間通訊規則的集合,它規定了通訊時資訊必須採用的格式和這些格式的意義。
由於網路節點之間聯絡的複雜性,在制定協議時,通常把複雜成分分解成一些簡單成分,然後再將它們複合起來。最常用的複合技術就是層次方式,網路協議的層次結構如下:
(1)結構中的每一層都規定有明確的服務及介面標準。
(2)把使用者的應用程式作為最高層。
(3)除了最高層外,中間的每一層都向上一層提供服務,同時又是下一層的使用者。
(4)把物理通訊線路作為最低層,它使用從最高層傳送來的引數,是提供服務的基礎。
分層詳情
為了使不同計算機廠家生產的計算機能夠相互通訊,以便在更大的範圍內建立計算機網路,國際標準化組織(ISO)在1978年提出了“開放系統互聯參考模型”,即著名的OSI/RM模型(Open System Interconnection/Reference Model)。它將計算機網路體系結構的通訊協議劃分為七層,自下而上依次為:物理層(Physics Layer)、資料鏈路層(Data Link Layer)、網路層(Network Layer)、傳輸層(Transport Layer)、會話層(Session Layer)、表示層(Presentation Layer)、應用層(Application Layer)。
其中第四層完成資料傳送服務,上面三層面向用戶。對於每一層,至少制定兩項標準:服務定義和協議規範。前者給出了該層所提供的服務的準確定義,後者詳細描述了該協議的動作和各種有關規程,以保證服務的提供。以下為各層詳細介紹:
第一層:物理層
規定通訊裝置的機械的、電氣的、功能的和過程的特性,用以建立、維護和拆除物理鏈路連線。具體地講,機械 特性規定了網路連線時所需接外掛的規格尺寸、引腳數量和排列情況等;電氣特性規定了在物理連線上傳輸bit流時線路上訊號電平的大小、阻抗匹配、傳輸速率 距離限制等;功能特性是指對各個訊號先分配確切的訊號含義,即定義了DTE和DCE之間各個線路的功能;規程特性定義了利用訊號線進行bit流傳輸的一組操作規程。在這一層,資料的單位稱為位元(bit)。屬於物理層定義的包括:乙太網、調變解調器、電力線通訊(PLC)、SONET/SDH、G.709、光導纖維、同軸電纜、雙絞線等。
第二層:資料鏈路層
在物理層提供位元流服務的基礎上,建立相鄰結點之間的資料鏈路,通過差錯控制提供資料幀(Frame)在通道上無差錯的傳輸,並進行各電路上的動作系列。資料鏈路層在不可靠的物理介質上提供可靠的傳輸。該層的作用包括:實體地址定址、資料的成幀、流量控制、資料的檢錯、重發等。在這一層,資料的單位稱為幀(Frame)。屬於資料鏈路層的包括:Wi-Fi(IEEE 802.11)、WiMAX(IEEE 802.16)、ATM、DTM、令牌環、乙太網、FDDI、幀中繼、GPRS、EVDO、HSPA、HDLC、PPP、L2TP、PPTP、ISDN、STP等。
第三層:網路層
在計算機網路中進行通訊的兩個計算機之間可能會經過很多個數據鏈路,也可能還要經過很多通訊子網。網路層的任務就是選擇合適的網間路由和交換結點, 確保資料及時傳送。網路層將資料鏈路層提供的幀組成資料包,包中封裝有網路層包頭,其中含有邏輯地址資訊–源站點和目的站點地址的網路地址。如果你在談論一個IP地址,那麼你是在處理第三層的問題,這是“資料包”問題,而不是第二層的“幀”。IP是第三層問題的一部分,此外還有一些路由協議和地址解析協議(ARP)。有關路由的一切事情都在這第三層處理。地址解析和路由是三層的重要目的。網路層還可以實現擁塞控制、網際互連等功能。在這一層,資料的單位稱為資料包(packet)。網路層的協議包括:IP(IPv4、IPv6)、ICMP、ICMPv6、IGMP、IS-IS、IPsec、ARP、RARP等。
第四層:傳輸層
第4層的資料單元也稱作資料包(packets)。但是,當你談論TCP等具體的協議時又有特殊的叫法,TCP的資料單元稱為段 (segments)而UDP協議的資料單元稱為“資料報(datagrams)”。這個層負責獲取全部資訊,因此,它必須跟蹤資料單元碎片、亂序到達的 資料包和其它在傳輸過程中可能發生的危險。第4層為上層提供端到端(終端使用者到終端使用者)的透明的、可靠的資料傳輸服務。所為透明的傳輸是指在通訊過程中 傳輸層對上層遮蔽了通訊傳輸系統的具體細節。傳輸層的協議包括:TCP、UDP、TLS、DCCP、SCTP、RSVP、OSPF等。
第五層:會話層
這一層也可以稱為會晤層或對話層,在會話層及以上的高層次中,資料傳送的單位不再另外命名,而是統稱為報文。會話層不參與具體的傳輸,它提供包括訪問驗證和會話管理在內的建立和維護應用之間通訊的機制。如伺服器驗證使用者登入便是由會話層完成的。
第六層:表示層
這一層主要解決擁護資訊的語法表示問題。它將欲交換的資料從適合於某一使用者的抽象語法,轉換為適合於OSI系統內部使用的傳送語法。即提供格式化的表示和轉換資料服務。資料的壓縮和解壓縮, 加密和解密等工作都由表示層負責。
第七層:應用層
應用層為作業系統或網路應用程式提供訪問網路服務的介面。應用層的協議包括:
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協議的網路通訊的基本操作單元。它是網路通訊過程中端點的抽象表示,包含進行網路通訊必須的五種資訊:連線使用的協議,本地主機的IP地址,本地程序的協議埠,遠地主機的IP地址,遠地程序的協議埠。
TCP連線
TCP連線包含三次握手過程,其過程介紹如下:
第一次握手:客戶端傳送syn包(syn=j)到伺服器,並進入SYN_SEND狀態,等待伺服器確認;
第二次握手:伺服器收到syn包,必須確認客戶的SYN(ack=j+1),同時自己也傳送一個SYN包(syn=k),即SYN+ACK包,此時伺服器進入SYN_RECV狀態;
第三次握手:客戶端收到伺服器的SYN+ACK包,向伺服器傳送確認包ACK(ack=k+1),此包傳送完畢,客戶端和伺服器進入ESTABLISHED狀態,完成三次握手。
握手過程中傳送的包裡不包含資料,三次握手完畢後,客戶端與伺服器才正式開始傳送資料。理想狀態下,TCP連線一旦建立,在通訊雙方中的任何一方主動關閉連線之前,TCP連線都將被一直保持下去。斷開連線時伺服器和客戶端均可以主動發起斷開TCP連線的請求,斷開過程需要經過“四次握手”。
Socket連線
由於通常情況下Socket連線就是TCP連線,因此Socket連線一旦建立,通訊雙方即可開始相互發送資料內容,直到雙方連線斷開。但在實際網路應用中,客戶端到伺服器之間的通訊往往需要穿越多箇中間節點,例如路由器、閘道器、防火牆等,大部分防火牆預設會關閉長時間處於非活躍狀態的連線而導致 Socket連線斷連,因此需要通過輪詢告訴網路,該連線處於活躍狀態。
建立Socket連線至少需要一對套接字,其中一個運行於客戶端,稱為ClientSocket ,另一個運行於伺服器端,稱為ServerSocket。
套接字之間的連線過程分為三個步驟:伺服器監聽,客戶端請求,連線確認。
1、伺服器監聽:伺服器端套接字並不定位具體的客戶端套接字,而是處於等待連線的狀態,實時監控網路狀態,等待客戶端的連線請求。
2、客戶端請求:指客戶端的套接字提出連線請求,要連線的目標是伺服器端的套接字。為此,客戶端的套接字必須首先描述它要連線的伺服器的套接字,指出伺服器端套接字的地址和埠號,然後就向伺服器端套接字提出連線請求。
3、連線確認:當伺服器端套接字監聽到或者說接收到客戶端套接字的連線請求時,就響應客戶端套接字的請求,建立一個新的執行緒,把伺服器端套接字的描述發給客戶端,一旦客戶端確認了此描述,雙方就正式建立連線。而伺服器端套接字繼續處於監聽狀態,繼續接收其他客戶端套接字的連線請求。
HTTP連線
HTTP協議是建立在TCP協議之上的一種應用,HTTP連線使用的是“請求—響應”的方式,不僅在請求時需要先建立連線,而且需要客戶端向伺服器發出請求後,伺服器端才能回覆資料。在請求結束後,會主動釋放連線。從建立連線到關閉連線的過程稱為“一次連線”。由於HTTP在每次請求結束後都會主動釋放連線,因此HTTP連線是一種“短連線”,要保持客戶端程式的線上狀態,需要不斷地向伺服器發起連線請求。通常的做法是即時不需要獲得任何資料,客戶端也保持每隔一段固定的時間向伺服器傳送一次“保持連線”的請求,伺服器在收到該請求後對客戶端進行回覆,表明知道客戶端“線上”。若伺服器長時間無法收到客戶端的請求,則認為客戶端“下線”,若客戶端長時間無法收到伺服器的回覆,則認為網路已經斷開。
TCP/IP協議和HTTP協議之間的關係
TPC/IP協議是傳輸層協議,主要解決資料如何在網路中傳輸,而HTTP是應用層協議,主要解決如何包裝資料。實際上HTTP協議就是建立在TCP/IP協議之上的。
Socket和TCP/IP協議之間的關係
TCP/IP只是一個協議棧,就像作業系統的執行機制一樣,必須要具體實現,同時還要提供對外的操作介面。這個就像作業系統會提供標準的程式設計介面,比如win32程式設計介面一樣,TCP/IP也要提供可供程式設計師做網路開發所用的介面,這就是Socket程式設計介面。
TCP/IP協議,HTTP協議,Socket三者之間的關係
實際上,傳輸層的TCP是基於網路層的IP協議的,而應用層的HTTP協議又是基於傳輸層的TCP協議的,而Socket本身不算是協議,它只是提供了一個針對TCP或者UDP程式設計的介面。
TCP協議
傳輸控制協議,提供的是面向連線、可靠的位元組流服務。當客戶和伺服器彼此交換資料前,必須先在雙方之間建立一個TCP連線,之後才能傳輸資料。TCP提供超時重發,丟棄重複資料,檢驗資料,流量控制等功能,保證資料能從一端傳到另一端。
UDP協議
使用者資料報協議,是一個無連線的簡單的面向資料報的傳輸層協議。UDP不提供可靠性,它只是把應用程式傳給IP層的資料報傳送出去,但是並不能保證它們能到達目的地。由於UDP在傳輸資料報前不用在客戶和伺服器之間建立一個連線,且沒有超時重發等機制,故而傳輸速度很快。
TCP協議和UDP協議之間的區別
TCP傳送的包有序號,對方收到包後要給一個反饋,如果超過一定時間還沒收到反饋就自動執行超時重發,因此TCP最大的優點是可靠。一般網頁(http)、郵件(SMTP)、遠端連線(Telnet)、檔案(FTP)傳送就用TCP。
UDP是面向訊息的協議,通訊時不需要建立連線,資料的傳輸自然是不可靠的,UDP一般用於多點通訊和實時的資料業務,比如語音廣播、視訊、QQ、TFTP(簡單檔案傳送)、SNMP(簡單網路管理協議)、RTP(實時傳送協議)RIP(路由資訊協議,如報告股票市場,航空資訊)、DNS(域名解釋)。注重速度流暢。
FTP協議
檔案傳輸協議(File Transfer Protocol, FTP)是TCP/IP網路上兩臺計算機傳送檔案的協議,FTP是在TCP/IP網路和INTERNET上最早使用的協議之一,它屬於網路協議組的應用層。FTP客戶機可以給伺服器發出命令來下載檔案,上載檔案,建立或改變伺服器上的目錄。
協議詳解
IP協議
IP協議是TCP/IP協議簇中的核心協議,也是TCP/IP的載體。所有的TCP,UDP,ICMP及IGMP資料都以IP資料報格式傳輸。IP提供不可靠的,無連線的資料傳送服務。不可靠指它不能保證IP資料報能成功到達目的地。IP僅提供最好的傳輸服務。當發生某種錯誤時,如某個路由器暫時用完了緩衝區,IP有一個簡單的錯誤處理演算法:丟棄該資料報,然後傳送ICMP訊息給信源。任何要求的可靠性必須由上層來提供。無連線指IP並不維護任何關於後續資料報的狀態資訊。每個資料報的處理是相互獨立的。IP資料報可以不按傳送順序接收。如果一信源向相同的信宿傳送兩個連續的資料報(先是A,然後是B)每個資料報都是獨立的進行路由選擇,可能選擇不同的路線,因此B可能在A到達之前先到達。
IP實現兩個基本功能:定址和分段。IP可以根據資料包包頭中包括的目的地址將資料報傳送到目的地址,在此過程中IP負責選擇傳送的道路,這種選擇道路稱為路由功能。如果有些網路內只能傳送小資料報,IP可以將資料報重新組裝並在報頭域內註明。IP模組中包括這些基本功能,這些模組存在於網路中的每臺主機和閘道器上,而且這些模組(特別在閘道器上)有路由選擇和其它服務功能。對IP來說,資料報之間沒有什麼聯絡,對IP不好說什麼連線或邏輯鏈路。
IP使用四個關鍵技術提供服務:服務型別,生存時間,選項和報頭校驗碼。服務型別指希望得到的服務質量,服務型別是一個引數集,這些引數是Internet能夠提供服務的代表,這種服務型別由閘道器使用,用於在特定的網路,或是用於下下一個要經過的網路,或是下一個要對這個資料報進行路由的閘道器上選擇實際的傳送引數。生存時間是資料報可以生存的時間上限,它由傳送者設定,由經過路由的地方處理,如果未到達時生存時間為零,拋棄此資料報。對於控制函式來說選項是重要的,但對於通常的通訊來說它沒有存在的必要,選項包括時間戳,安全和特殊路由。報頭校驗碼保證資料的正確傳輸,如果校驗出錯,拋棄整個資料報。
其協議頭解釋如下:
版本[4bit]
指IP協議的版本。通訊雙方使用的IP協議版本必須一致。目前廣泛使用的IP協議版本號為4(即IPv4)。關於IPv6,目前還處於草案階段。首部長度[4bit]
可表示的最大十進位制數值是15。請注意,這個欄位所表示數的單位是32位字長(1個32位字長是4位元組),因此,當IP的首部長度為1111時(即十進位制的15),首部長度就達到60位元組。當IP分組的首部長度不是4位元組的整數倍時,必須利用最後的填充欄位加以填充。因此資料部分永遠在4位元組的整數倍開始,這樣在實現IP協議時較為方便。首部長度限制為60位元組的缺點是有時可能不夠用。但這樣做是希望使用者儘量減少開銷。最常用的首部長度就是20位元組(即首部長度為0101),這時不使用任何選項。區分服務[8bit]
用來獲得更好的服務。這個欄位在舊標準中叫做服務型別,但實際上一直沒有被使用過。1998年IETF把這個欄位改名為區分服務DS(Differentiated Services)。只有在使用區分服務時,這個欄位才起作用。總長度[16bit]
總長度指首部和資料之和的長度,單位為位元組。總長度欄位為16位,因此資料報的最大長度為65535位元組。
注:在IP層下面的每一種資料鏈路層都有自己的幀格式,其中包括幀格式中的資料欄位的最大長度,這稱為最大傳送單元MTU(Maximum Transfer Unit)。當一個數據報封裝成鏈路層的幀時,此資料報的總長度(即首部加上資料部分)一定不能超過下面的資料鏈路層的MTU值。標識(identification)[16bit]
IP軟體在儲存器中維持一個計數器,每產生一個數據報,計數器就加1,並將此值賦給標識欄位。但這個“標識”並不是序號,因為IP是無連線服務,資料報不存在按序接收的問題。當資料報由於長度超過網路的MTU而必須分片時,這個標識欄位的值就被複制到所有的資料報的標識欄位中。相同的標識欄位的值使分片後的各資料報片最後能正確地重灌成為原來的資料報。標誌(flag)[3bit]
佔3位,但目前只有2位有意義。標誌欄位中的最低位記為MF(More Fragment)。MF=1即表示後面“還有分片”的資料報。MF=0表示這已是若干資料報片中的最後一個;標誌欄位中間的一位記為DF(Don’t Fragment),意思是“不能分片”。只有當DF=0時才允許分片。片偏移[13bit]
片偏移指出:較長的分組在分片後,某片在原分組中的相對位置。也就是說,相對使用者資料欄位的起點,該片從何處開始。片偏移以8個位元組為偏移單位。這就是說,每個分片的長度一定是8位元組(64位)的整數倍。生存時間[8bit]
生存時間欄位常用的的英文縮寫是TTL(Time To Live),表明是資料報在網路中的壽命。由發出資料報的源點設定這個欄位。其目的是防止無法交付的資料報無限制地在因特網中兜圈子,因而白白消耗網路資源。最初的設計是以秒作為TTL的單位。每經過一個路由器時,就把TTL減去資料報在路由器消耗掉的一段時間。若資料報在路由器消耗的時間小於1秒,就把TTL值減1。當TTL值為0時,就丟棄這個資料報。協議[8bit]
協議欄位指出此資料報攜帶的資料是使用何種協議,以便使目的主機的IP層知道應將資料部分上交給哪個處理過程。首部檢驗和[16bit]
這個欄位只檢驗資料報的首部,但不包括資料部分。這是因為資料報每經過一個路由器,路由器都要重新計算一下首部檢驗和(一些欄位,如生存時間、標誌、片偏移等都可能發生變化),不檢驗資料部分可減少計算的工作量。源IP地址[32bit]
目的IP地址[32bit]
TCP協議
TCP協議是面向連線、保證高可靠性(資料無丟失、資料無失序、資料無錯誤、資料無重複到達)傳輸層協議。
其協議頭解釋如下:
埠號[16bit]
在TCP頭中,有源埠號(Source Port)和目標埠號(Destination Port)。源埠號標識了傳送主機的程序,目標埠號標識接收方主機的程序。序號[32bit]
序號分為傳送序號(Sequence Number)和確認序號(Acknowledgment Number)。
傳送序號:用來標識從TCP源端向TCP目的端傳送的資料位元組流,它表示在這個報文段中的第一個資料位元組的順序號。
確認序號:包含傳送確認的一端所期望收到的下一個順序號。因此,確認序號應當是上次已成功收到資料位元組順序號加1。只有ACK標誌為1時確認序號欄位才有效。TCP為應用層提供全雙工服務,這意味資料能在兩個方向上獨立地進行傳輸。因此,連線的每一端必須保持每個方向上的傳輸資料順序號。偏移[4bit]
這裡的偏移實際指的是TCP首部的長度,它用來表明TCP首部中32bit字的數目,通過它可以知道一個TCP包它的使用者資料是從哪裡開始的。Reserved [6bit]
目前沒有使用,它的值都為0標誌[6bit]
在TCP首部中有6個標誌位,可同時被置為1,代表意思如下:
URG:緊急指標(urgent pointer)有效
ACK:確認序號有效
PSH:指示接收方應該儘快將這個報文段交給應用層而不用等待緩衝區裝滿
RST:一般表示斷開一個連線
SYN:同步序號用來發起一個連線
FIN:傳送端完成傳送任務(即斷開連線)視窗大小(window)[16bit]
視窗的大小,表示源方法最多能接收的位元組數。校驗和[16bit]
校驗和覆蓋了整個的TCP報文段:TCP首部和TCP資料。這是一個強制性的欄位,一定是由發端計算和儲存,並由接收端進行驗證。緊急指標[16bit]
只有當URG標誌置為1時緊急指標才有效。緊急指標是一個正的偏移量,和序號欄位中的值相加表示緊急資料最後一個位元組的序號。TCP的緊急方式是傳送端向另一端傳送緊急資料的一種方式。TCP選項
是可選的
UDP協議
傳輸層協議,使用者資料報協議,不可靠的協議,只負責把應用層的協議的資料傳送到IP層的資料報,而不管資料是否到達。它的協議頭比較簡單,如下:
埠號[16bit]
與TCP一樣,也有源埠號(Source Port)和目標埠號(Destination Port)。源埠號標識了傳送主機的程序,目標埠號標識接收方主機的程序。Length[16bit]
標識UDP頭的長度。Checksum[16bit]
校驗和,包含UDP頭和資料部分。
HTTP協議
1、定義
HTTP全稱是HyperText Transfer Protocal,即:超文字傳輸協議,從1990年開始就在WWW上廣泛應用,是現今在WWW上應用最多的協議,HTTP是應用層協議,並且HTTP協議是基於TCP連線的,主要解決的是如何包裝協議的。當你上網瀏覽網頁的時候,瀏覽器和Web伺服器之間就會通過HTTP在Internet上進行資料的傳送和接收。HTTP是一個基於請求/響應模式的、無狀態的協議。即我們通常所說的Request/Response。
2、URL解析
URL(Uniform Resource Locator:統一資源定位符)地址用於描述一個網路上的資源, 基本格式如下:schema://host[:port#]/path/…/[?query-string][#anchor]
scheme:
指定底層使用的協議(例如:http,https,ftp);
host:
HTTP伺服器的IP地址或者域名;
port#:
HTTP伺服器的預設埠是80,這種情況下埠號可以省略,如果使用了別的埠,必須指明,例如http://www.xiaoyaoyou1212.com:8080/;
path:
訪問資源的路徑;
query-string:
傳送給HTTP伺服器的資料;
anchor:
錨。
描述 | 示例 |
---|---|
Schema | http |
Host | www.mywebsite.com |
Path | /sj/test/test.aspx |
Query String | name=sviergn&x=true |
Anchor | stuff |
3、HTTP的Request訊息的結構
Request訊息分為3部分:Request line,Request header,body.header和body之間有個空行。
Method
表示請求方法,比如”POST”,”GET”等。Path-to-resoure
表示請求的資源Http/version-number
表示HTTP協議的版本號
注:當使用的是”GET”方法的時候,body是為空的,比如我們開啟CSDN部落格首頁的request如下:
GET http://www.cnblogs.com HTTP/1.1
Host: blog.csdn.net
Accept
作用:表示瀏覽器端可以接受的媒體型別
例如:Accept:text/html,代表瀏覽器可以接受伺服器回發的型別為text/html,也就是我們常說的html文件,如果伺服器無法返回text/html型別的資料,伺服器應該返回一個406錯誤(non acceptable);萬用字元代表任意型別,例如Accept: /*代表瀏覽器可以處理所有型別(一般瀏覽器發給伺服器都是發這個)。Referer
作用:提供了Request的上下文資訊的伺服器,告訴伺服器我是從哪個連結過來的,比如從我主頁上鍊接到一個朋友那裡,他的伺服器就能夠從HTTP Referer中統計出每天有多少使用者點選我主頁上的連結訪問他的網站。
例如:Referer:http://blog.csdn.net/xiaoyaoyou1212
Accept-Language
作用:瀏覽器申明自己接收的語言
注:語言跟字符集的區別:中文是語言,中文有多種字符集,比如big5,gb2312,gbk等等
例如:Accept-Language: en-usContent-Type
作用:指定不同格式的請求資訊
例如:Content-Type: application/x-www-form-urlencodedAccept-Encoding:
作用:瀏覽器申明自己接收的編碼方法,通常指定壓縮方法,是否支援壓縮,支援什麼壓縮方法(gzip,deflate)(注意:這不是指字元編碼);
例如: Accept-Encoding: gzip, deflateUser-Agent
作用:告訴HTTP伺服器,客戶端使用的作業系統和瀏覽器的名稱和版本
例如: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
作用:表示網頁下次開啟時是否需要重新建立連線
例如:Connection:keep-alive,當一個網頁開啟完成後,客戶端和伺服器之間用於傳輸HTTP資料的TCP連線不會關閉,如果客戶端再次訪問這個伺服器上的網頁,會繼續使用這一條已經建立的連線;Connection: close,代表一個Request完成後,客戶端和伺服器之間用於傳輸HTTP資料的TCP連線會關閉,當客戶端再次傳送Request,需要重新建立TCP連線。Content-Length
作用:表示傳送給HTTP伺服器資料的長度
例如:Content-Length: 38Host(傳送請求時,該報頭域是必需的)
作用:請求報頭域主要用於指定被請求資源的Internet主機和埠號,它通常從HTTP URL中提取出來的
例如:在瀏覽器中輸入:http://blog.csdn.net/xiaoyaoyou1212,瀏覽器傳送的請求訊息中,就會包含Host請求報頭域Host:http://blog.csdn.net/xiaoyaoyou1212
,此處使用預設埠號80,若指定了埠號,則變成:Host:指定埠號Pragma
作用:防止頁面被快取,在HTTP/1.1版本中,它和Cache-Control:no-cache作用一模一樣
例如:Pragma: no-cacheCookie
作用:最重要的header, 將cookie的值傳送給HTTP伺服器Accept-Charset
作用:瀏覽器申明自己接收的字符集,這就是本文前面介紹的各種字符集和字元編碼,如gb2312,utf-8(通常我們說Charset包括了相應的字元編碼方案)
4、HTTP的Response訊息的結構
Response訊息分為3部分:Response line,Response header,body.header和body之間有個空行。
HTTP/version-number
表示HTTP協議的版本號Status-code
表示響應碼,如200、404、500等Message
狀態資訊描述Cache-Control
作用: 這個是非常重要的規則,用來指定Response-Request遵循的快取機制。
各個指令含義如下:
Cache-directive | 說明 |
---|---|
public | 所有內容都將被快取(客戶端和代理伺服器都可快取) |
private | 內容只快取到私有快取中(僅客戶端可以快取,代理伺服器不可快取) |
no-cache | 必須先與伺服器確認返回的響應是否被更改,然後才能使用該響應來滿足後續對同一個網址的請求。因此,如果存在合適的驗證令牌 (ETag),no-cache 會發起往返通訊來驗證快取的響應,如果資源未被更改,可以避免下載。 |
no-store | 所有內容都不會被快取到快取或 Internet 臨時檔案中 |
must-revalidation/proxy-revalidation | 如果快取的內容失效,請求必須傳送到伺服器/代理以進行重新驗證 |
max-age=xxx (xxx is numeric) | 快取的內容將在 xxx 秒後失效, 這個選項只在HTTP 1.1可用, 並如果和Last-Modified一起使用時, 優先順序較高 |
- Content-Type
作用:WEB伺服器告訴瀏覽器自己響應的物件的型別和字符集
例如:
Content-Type: text/html; charset=utf-8
Content-Type: text/html; charset=GB2312
Content-Type: image/jpeg
Expires
作用:瀏覽器會在指定過期時間內使用本地快取
例如:Expires: Tue, 08 Feb 2022 12:00:00 GMT
Last-Modified
作用:用於指示資源的最後修改日期和時間
例如:Last-Modified: Wed, 21 Dec 2011 12:00:00 GMTServer
作用:指明HTTP伺服器的軟體資訊
例如:Server: Microsoft-IIS/7.5X-AspNet-Version
作用:如果網站是用ASP.NET開發的,這個header用來表示ASP.NET的版本
例如: X-AspNet-Version: 4.0.30319X-Powered-By
作用:表示網站是用什麼技術開發的
例如:X-Powered-By: ASP.NETConnection
作用:表示網頁下次開啟時是否需要重新建立連線
例如:Connection: keep-alive,當一個網頁開啟完成後,客戶端和伺服器之間用於傳輸HTTP資料的TCP連線不會關閉,如果客戶端再次訪問這個伺服器上的網頁,會繼續使用這一條已經建立的連線;Connection: close,代表一個Request完成後,客戶端和伺服器之間用於傳輸HTTP資料的TCP連線會關閉, 當客戶端再次傳送Request,需要重新建立TCP連線。Content-Length
作用:指明實體正文的長度,以位元組方式儲存的十進位制數字來表示。在資料下行的過程中,Content-Length的方式要預先在伺服器中快取所有資料,然後所有資料再一起發給客戶端。
例如:Content-Length: 19847Date
作用:生成訊息的具體時間和日期
例如:Date: Sat, 11 Feb 2012 12:00:00 GMT
5、HTTP協議之GET和POST
HTTP協議定義了很多與伺服器互動的方法,最基本的有4種,分別是GET,POST,PUT,DELETE。一個URL地址用於描述一個網路上的資源,而HTTP中的GET,POST,PUT,DELETE就對應著對這個資源的查、改、增、刪4個操作。最常見的就是GET和POST,GET一般用於獲取/查詢資源資訊,而POST一般用於更新資源資訊。其區別如下:
GET提交的資料會放在URL之後,以?分割URL和傳輸資料,引數之間以&相連,如
EditPosts.aspx?name=test&id=123456
,POST方法是把提交的資料放在HTTP包的Body中;GET提交的資料大小有限制(因為瀏覽器對URL的長度有限制),而POST方法提交的資料沒有限制;
GET方式需要使用Request.QueryString來取得變數的值,而POST方式通過Request.Form來獲取變數的值,也就是說GET是通過位址列來傳值,而POST是通過提交表單來傳值;
GET方式提交資料,會帶來安全問題,比如一個登入頁面,通過GET方式提交資料時,使用者名稱和密碼將出現在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();
}
呼叫如下:
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();
}
呼叫如下:
new Thread(new Runnable() {
@Override
public void run() {
try {
UDP.receiveData();
UDP.sendData("逍遙遊".getBytes());
} catch (IOException e) {
e.printStackTrace();
}
}
}).start();
注:其中的IP地址換成待除錯手機的IP地址,手機IP地址檢視:開啟設定,進入關於手機,找到手機狀態資訊,裡面就有IP地址等相關資訊。