都是通訊協議,也就是通訊時所遵照的規則,僅僅有兩方依照這個規則「說話」。對方纔幹理解或爲之服務。html
TCP
TCP/IP是個協議組。可分爲四個層次:網絡接口層、網絡層、傳輸層和應用層。瀏覽器
在網絡層有IP協議、ICMP協議、ARP協議、RARP協議和BOOTP協議。緩存
在傳輸層中有TCP協議與UDP協議。安全
在應用層有FTP、HTTP、TELNET、SMTP、DNS等協議。cookie
所以,HTTP自己就是一個協議,是從Webserver傳輸超文本到本地瀏覽器的傳送協議。網絡
socket:
這是爲了實現以上的通訊過程而創建成來的通訊管道。其真實的表明是client和server端的一個通訊進程,兩方進程經過socket進行通訊,而通訊的規則採用指定的協議。app
socket僅僅是一種鏈接模式,不是協議,tcp、udp,簡單的說(儘管不許確)是兩個最主要的協議,很是多其它協議都是基於這兩個協議如,http就是基於tcp的,.用socket可以建立tcp鏈接,也可以建立udp鏈接。這意味着,用socket可以建立不論什麼協議的鏈接。因爲其它協議都是基於此的。socket
如下咱們主要來看一下和咱們互聯網生活密切相關的協議:HTTPtcp
什麼是Http協議
HTTP全稱是HyperText Transfer Protocal。即:超文本傳輸協議。從1990年開始就在WWW上普遍應用,是現今在WWW上應用最多的協議,
Http是一個基於請求/響應模式的、無狀態的協議。即咱們一般所說的Request/Response。
URL:
URL(Uniform Resource Locator) 地址用於描寫敘述一個網絡上的資源,
schema://host[:port#]/path/…/[?query-string][#anchor]
scheme
host
port#
path
query-string
anchor-
URL 的一個樣例
http://www.mywebsite.com/sj/test/test.aspx?name=sviergn&x=true#stuff
Schema:
host:
path:
Query String:
Anchor:
HTTP的Request/Response:
先看Request 消息的結構,
第一部分叫Request line,
第三部分是body. header和body之間有個空行,
第一行中的Method表示請求方法,比方」POST」,」GET」,
當使用的是」GET」 方法的時候, body是爲空的
比方咱們打開博客園首頁的request 例如如下
GET http://www.cnblogs.com/ HTTP/1.1
Host:
抽象的東西。難以理解,老感受是虛的, 所謂眼見爲實, 實際見到的東西,咱們才幹理解和記憶。 咱們今天用Fiddler,實際的看看Request和Response.
如下咱們打開Fiddler 捕捉一個博客園登陸的Request 而後分析下它的結構, 在Inspectors tab下以Raw的方式可以看到完整的Request的消息,
Accept
做用:
好比:
假設server沒法返回text/html類型的數據,server應該返回一個406錯誤(non acceptable)
通配符 * 表明隨意類型
好比
Referer:
做用: 提供了Request的上下文信息的server,告訴server我是從哪一個連接過來的,比方從我主頁上連接到一個朋友那裏,他的server就可以從HTTP Referer中統計出天天有多少用戶點擊我主頁上的連接訪問他的站點。
好比: Referer:http://translate.google.cn/?hl=zh-cn&tab=wT
Accept-Language
做用: 瀏覽器申明本身接收的語言。
語言跟字符集的差異:中文是語言,中文有多種字符集,比方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
做用:告訴HTTPserver, client使用的操做系統和瀏覽器的名稱和版本號.
咱們上網登錄論壇的時候,每每會看到一些歡迎信息。當中列出了你的操做系統的名稱和版本號,你所使用的瀏覽器的名稱和版本號,這每每讓很是多人感到很是奇妙,實際上。server應用程序就是從User-Agent這個請求報頭域中獲取到這些信息User-Agent請求報頭域贊成client將它的操做系統、瀏覽器和其它屬性告訴server。
好比:
Connection
好比: Connection: keep-alive
好比:
Content-Length
做用:發送給HTTPserver數據的長度。
好比: Content-Length: 38
Host(發送請求時。該報頭域是必需的)
做用: 請求報頭域主要用於指定被請求資源的Internet主機和port號,它一般從HTTP URL中提取出來的
好比: 咱們在瀏覽器中輸入:http://www.guet.edu.cn/index.html
瀏覽器發送的請求消息中,就會包括Host請求報頭域,例如如下:
Host:http://www.guet.edu.cn
此處使用缺省port號80。若指定了port號,則變成:Host:指定port號
Pragma
做用: 防止頁面被緩存。 在HTTP/1.1版本號中。它和Cache-Control:no-cache做用如出一轍
Pargma僅僅有一個使用方法, 好比: Pragma: no-cache
Cookie:
做用: 最重要的header, 將cookie的值發送給HTTP server
Accept-Charset
做用:瀏覽器申明本身接收的字符集。這就是本文前面介紹的各類字符集和字符編碼,如gb2312。utf-8(一般咱們說Charset包括了相應的字符編碼方案)。
咱們再看Response消息的結構, 和Request消息的結構基本同樣。 相同也分爲三部分
第一部分叫Response line,
第三部分是body. header和body之間也有個空行,
HTTP/version-number表示HTTP協議的版本號號,
咱們用Fiddler 捕捉一個博客園首頁的Response而後分析下它的結構, 在Inspectors tab下以Raw的方式可以看到完整的Response的消息,
Cache-Control
做用: 這個是很是重要的規則。
這個用來指定Response-Request遵循的緩存機制。各個指令含義例如如下
Cache-Control:Public
Cache-Control:Private
Cache-Control:no-cache
還有其它的一些使用方法。 我沒搞懂當中的意思, 請你們參考其它的資料
Content-Type
做用:WEBserver告訴瀏覽器本身響應的對象的類型和字符集,
好比:
Content-Type: text/html; charset=utf-8
Content-Type:text/html;charset=GB2312
Content-Type: image/jpeg
Expires
做用: 瀏覽器會在指定過時時間內使用本地緩存
好比: Expires: Tue, 08 Feb 2022 11:35:14 GMT
Last-Modified:
做用: 用於指示資源的最後改動日期和時間。(實例請看上節的If-Modified-Since的實例)
好比: Last-Modified: Wed, 21 Dec 2011 09:09:10 GMT
Server:
做用:指明HTTPserver的軟件信息
好比:Server: Microsoft-IIS/7.5
X-AspNet-Version:
做用:假設站點是用ASP.NET開發的,這個header用來表示ASP.NET的版本號
好比: X-AspNet-Version: 4.0.30319
X-Powered-By:
做用:表示站點是用什麼技術開發的
好比: X-Powered-By: ASP.NET
Connection
好比: Connection: keep-alive
好比:
Content-Length
指明實體正文的長度,以字節方式存儲的十進制數字來表示。
在數據下行的過程當中。Content-Length的方式要預先在server中緩存所有數據。而後所有數據再一古腦兒地發給client。
好比: Content-Length: 19847
做用:
好比: Date: Sat, 11 Feb 2012 11:35:14 GMT
HTTP協議之Get和Post
Http協議定義了很是多與server交互的方法,最主要的有4種,各自是GET,POST,PUT,DELETE. 一個URL地址用於描寫敘述一個網絡上的資源,而HTTP中的GET, POST, PUT, DELETE就相應着對這個資源的查,改。增。刪4個操做。 咱們最多見的就是GET和POST了。GET通常用於獲取/查詢資源信息,而POST通常用於更新資源信息.
咱們看看GET和POST的差異
1. GET提交的數據會放在URL以後,以?
切割URL和數據傳輸,參數之間以&相連。如EditPosts.aspx?
name=test1&id=123456.
2. GET提交的數據大小有限制(因爲瀏覽器對URL的長度有限制)。而POST方法提交的數據沒有限制.
3. GET方式需要使用Request.QueryString來取得變量的值,而POST方式經過Request.Form來獲取變量的值,也就是說Get是經過地址欄來傳值,而Post是經過提交表單來傳值。
4. GET方式提交數據,會帶來安全問題,比方一個登陸頁面,經過GET方式提交數據時。username和password將出現在URL上,假設頁面可以被緩存或者其它人可以訪問這臺機器,就可以從歷史記錄得到該用戶的帳號和password.