也就是說,TCP是實現,而HTTP是使用TCP的一種標准。
Http發展歷程:
Http0.9:
只支持get方法,服務器只能回應HTML格式的字符串,服務器發送完就關閉TCP連接。
HTTP1.0:
支持get,head,post方法,每個TCP連接只能發送一個請求,為了復用TCP請求,可以使用非標准的方法,connetction:keep-alive
HTTP1.1:
默認支持connetction:keep-alive,同一TCP連接中,如果有多個請求,服務器只能處理最先的請求,才會處理下一個請求,如果最先的請求比較耗時,后面的請求就會阻塞。
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回答“知道了”,這樣通話才算結束。