標籤:
想象用瀏覽器開啟imooc.com網站,HTTP走過的環節:
1.首先,是對imooc.com網域名稱解析,
(1.1)瀏覽器搜尋瀏覽器自身的DNS緩衝。(DNS(Domain Name System,網域名稱系統),網際網路上作為網域名稱和IP地址相互映射的一個分散式資料庫,能夠使使用者更方便的訪問互連網,而不用去記住能夠被機器直接讀取的IP數串)
(1.2)如果瀏覽器沒有找到自身的DNS緩衝或之前的緩衝已失效,那麼瀏覽器會搜尋作業系統自身的DNS緩衝。
(1.3)如果作業系統的DNS緩衝也沒有找到,那麼系統會嘗試在本地的HOST檔案去找。(Hosts是一個沒有副檔名的系統檔案,可以用記事本等工具開啟,其作用就是將一些常用的網址網域名稱與其對應的IP地址建立一個關聯“資料庫”,當使用者在瀏覽器中輸入一個需要登入的網址時,系統會首先自動從Hosts檔案中尋找對應的IP地址,一旦找到,系統會立即開啟對應網頁,如果沒有找到,則系統再會將網址提交DNS網域名稱解析伺服器進行IP地址的解析)
(1.4)如果在HOST裡依然沒有找到,瀏覽器會發起一個DNS的系統調用,即一般向本地的寬頻電訊廠商發起網域名稱解析請求。這後面又可以試情況分很多步驟,第一,寬頻電訊廠商伺服器會首先查看自身的緩衝,看是否有結果,如果沒有,那麼電訊廠商伺服器會發起一個迭代DNS解析請求(根域,頂級域,網域名稱註冊商),最終會返回對DNS解析的結果。電訊廠商伺服器然後把結果返回給作業系統核心(同時也緩衝在自己的緩衝區),然後作業系統把結果返回給瀏覽器。
(1.5)以上的最終結果,是讓瀏覽器拿到imooc.com的IP地址,DNS解析完成。
2.然後,在瀏覽器獲得網域名稱的IP地址後,發起“三向交握”,建立TCP/IP串連。
3.在TCP/IP串連建立起來後,瀏覽器就可以向伺服器發送HTTP請求了。比如,用HTTP的GET方法請求一個根域裡的某個網域名稱,協議可以採用HTTP 1.0 。
4.伺服器端接受這個請求,根據路徑參數,經過後端的一些處理之後,把處理後的一個結果以資料的形式返回給瀏覽器,如果是imooc.com網站的頁面,伺服器就會把完整的HTML頁面代碼返回給瀏覽器。
5.瀏覽器拿到了imooc.com這個網站的完整HTML頁面代碼,在解析和渲染這個頁面的時候,裡面的Javascript、CSS、圖片等靜態資源,它們同樣也是一個個HTTP請求,都需要經過上面的步驟來擷取。
6.瀏覽器根據拿到的資源對頁面進行渲染,最終把一個完整的頁面呈現出來。
可以簡單地把http拆分成請求和響應,然後他們都有http頭和本文資訊,http頭髮送的是一些附加的資訊:內容類型,伺服器發送響應的日期,http狀態代碼。本文就是使用者提交的表單資料。
網域名稱解析->網域名稱 ->緩衝->根域dns->頂級域dns->本域dns->伺服器IP
1.搜尋瀏覽器自身DNS緩衝,如果不存在或者到期(>60s)放棄
2.搜尋作業系統自身的dns緩衝
3.讀取本地的HOST檔案
4.瀏覽器發起一個DNS的系統調用 網域名稱解析
5.用戶端通過隨機連接埠使用tcp協議伺服器ip的80連接埠發起串連請求 三向交握
6.tcp/ip串連請求建立後瀏覽器可以向伺服器發起http請求
7.http用戶端發起請求,建立連接埠,解析使用者操作,拼接要求標頭資訊
8.http用戶端並向伺服器的該連接埠發送request頭資訊
9.伺服器監聽連接埠 如80
10.http監聽到發到80連接埠的要求標頭資訊
11.http伺服器解析頭資訊
12.http伺服器 按照要求標頭資訊,返回相應回應標頭資訊response
13.回應標頭資訊發送給http用戶端,用戶端解析回應標頭資訊,並完成其他動作
14.完成一次http請求
waiting(TTFB):表示請求發出到收到響應中第一個位元組所耗費的時間。
要求方法
get:請求資源
post:提交資源
put:更新
delete:刪除
head:類似get
trace
options
伺服器請求狀態代碼:
1XX:指示資訊,表示資訊已接收,正在處理
2XX:已成功接收並處理。
3XX:重新導向
4XX:用戶端錯誤
5XX:伺服器端錯誤
1XX請求已接收,正在處理XX
2XX,,請求接受成功,處理完成,成功返回,200=0k
3XX,,重新導向
4XX,,用戶端錯誤,400 有語法錯誤不能理解,401請求未授權,403拒絕提供服務,404 未找到改地址,對象不存在
5XX,,伺服器端錯誤,500伺服器發生未知錯誤,503伺服器端當前不能處理
通過自己的理解這些問題
1.回調,即後續處理的函數作為參數出現在前驅函數中,對前驅函數中的一些操作進行處理
2.同步與非同步
同步是指後一項任務必須在前一項任務執行完畢後執行,程式的執行順序和任務的排列順序是一致的
//同步 打電話 等待 查詢 返回結果 掛電話 <br>
//非同步 打電話 留號碼 說明查詢 掛電話 出結果 回電話 完成<br>
//同步 下載 等待 完成 看片兒<br>
//非同步 下載a 下載b 下載c 下載完播放提示音看片兒 順序不定<br>
3.單線程/多線程
今天周日,人多,但是你還是一個人給自己挂號,你就是單線程的
本周日,漩渦鳴人用多重影分身給自己挂號,鳴人就是多線程的
4.i/o
磁碟的寫入 挂號的時候護士把你的資訊錄入,這就是寫入
磁碟的讀出 你掛完號去看病,輪到你了,醫生把你的資訊調出來,82歲 未婚, 哦,大齡單身狗啊,這就是讀出
5.阻塞/非阻塞
醫生告訴你你得好好檢查檢查,然後對你一陣敲敲打打,你啥也幹不了,只能被動享受,你就被阻塞了
醫生拍個片子就讓你滾回家,說看看,過兩天電話通知你結果,你想幹啥就幹啥,你就是非阻塞的
6.事件/事件驅動<br>
事件並不是立即執行,而是等待驅動(比如click)時才會被執行
為了某個事件註冊了回呼函數,但是這個回呼函數不是馬上執行,只有當事件發生的時候,才會調用回呼函數,這種函數執行的方式叫做事件驅動~這種註冊回調就是基於事件驅動的回調,如果這些回調和非同步I/O操作有關,可以看作是基於回調的非同步I/O,只不過這種回調在nodejs中是有事件來驅動的
7.事件迴圈 回呼函數隊列
倘若有大量的非同步作業以及io的耗時操作,甚至是定時器控制的延時操作,都要去調用相應的回呼函數,從而完成密集任務,而又不會阻塞整個程式的流程,就需要一個機制來管理,這個機制就是event loop
範圍
訪問變數或函數的能力,局部範圍可以訪問其外部或全域範圍下的變數或函數,外部或全域範圍訪問不了局部範圍。JS是函數級範圍;
上下文this
1.this在函數的內部使用
2.this指向的是函數擁有者
3.作為對象方法,this指向調用的對象自身;作為函數調用,this指向全域
call apply 改變this指定的對象的引用
b.setMessage.call(a,"a的訊息"):a執行時,內容物件調用b對象的setMessage方法,相當於a.setMessage("a的訊息")。
另外,call和apply的區別在於:call將參數依次傳遞給借用的方法作參數;而apply直接將這些參數放到一個數組中再傳遞。
全域變數使用this,指向函數擁有者
建構函式使用this,指向新構建好的函數,執行個體對象。
call 和 apply 都是為了改變某個函數運行時的 context 即上下文而存在的,換句話說,就是為了改變函數體內部 this 的指向。
二者的作用完全一樣,只是接受參數的方式不太一樣。
例如,有一個函數 func1 定義如下:
var func1 = function(arg1, arg2) {};
就可以通過 func1.call(this, arg1, arg2); 或者 func1.apply(this, [arg1, arg2]); 來調用。其中 this 是你想指定的上下文,他可以任何一個 JavaScript 對象(JavaScript 中一切皆對象),call 需要把參數按順序傳遞進去,而 apply 則是把參數放在數組裡。
JavaScript 中,某個函數的參數數量是不固定的,因此要說適用條件的話,當你的參數是明確知道數量時,用 call,而不確定的時候,用 apply,然後把參數 push 進數組傳遞進去。當參數數量不確定時,函數內部也可以通過 arguments 這個數組來便利所有的參數。
http請求過程