JavaScript--淺談Http與Tcp

HTTP是一個客戶端服務器端請求和應答的標準(TCP)。面試

也就是說,TCP是實現,而HTTP是使用TCP的一種標準。服務器

Http發展歷程:post

Http0.9:加密

只支持get方法,服務器只能迴應HTML格式的字符串,服務器發送完就關閉TCP鏈接。進程

HTTP1.0:字符串

支持get,head,post方法,每一個TCP鏈接只能發送一個請求,爲了複用TCP請求,能夠使用非標準的方法,connetction:keep-aliveget

HTTP1.1:it

默認支持connetction:keep-alive,同一TCP鏈接中,若是有多個請求,服務器只能處理最早的請求,纔會處理下一個請求,若是最早的請求比較耗時,後面的請求就會阻塞。io

HTTP2.0:請求

複用TCP而且能夠發送多個請求和迴應,不用按照請求順序進行處理。若是同一個TCP鏈接中有多個請求,服務器會將耗時比較多的請求,將處理好的部分發送,去處理下一個請求,處理完後再去處理耗時較多的。

 

說完了HTTP,再說說TCP

面試必備:

三次握手和四次揮手

三次握手(創建TCP鏈接):

1.創建新鏈接,客戶端發送一個包到服務器,等待服務器肯定。

2.服務器收到客戶端的包,迴應客戶端這個包加上一個新的包。

3.客戶端收到服務器的2個包,向服務端發送2個包的加密(1個包),客戶端與服務器進入鏈接成功的狀態

 

四次揮手(釋放TCP鏈接):

1.客戶端發出釋放請求(FIN)

2.服務器收到客戶端的釋放請求(FIN),通知應用進程,進入半關閉狀態,此時,服務器仍是能夠發送數據的,客戶端還要接受,同時發送關閉確認請求(ACK),客戶端收到服務器的確認請求(ACK)等待服務器發送最後的數據以及釋放請求(FINI)

3.服務器把最後的數據發送完後,向客戶端發送釋放請求(FIN)

4.客戶端收到服務器的釋放請求(FIN),發送服務器確認請求(ACK),服務器收到肯定關閉請求(ACK)後,關閉TCP,客戶端等一段時間後關閉鏈接。

 

爲何要四次揮手,而不是三次?

答:根本緣由是,一方發送FIN只表示本身發完了全部要發的數據,但還容許對方繼續把沒發完的數據發過來。

        舉個例子:A和B打電話,通話即將結束後,A說「我沒啥要說的了」,B回答「我知道了」,可是B可能還會有要說的話,A不能要求B跟着本身的節奏結束通話,因而B可能又巴拉巴拉說了一通,最後B說「我說完了」,A回答「知道了」,這樣通話纔算結束。

相關文章
相關標籤/搜索