作為一個程序員,假設我們要在a電腦的進程里發一段數據到b電腦,一般使用socket編程,可選項也就tcp,udp二選一
socket本質上就是一個代碼庫
tcp有粘包問題(字節流),純裸tcp不能之際拿來使用
所以我們需要加入一些自定義的規則,用來區分消息邊界,比如加入消息頭(消息頭里寫清除一個完整的包長度是多少,還可以放消息體是否被壓縮過,消息體格式之類的)
自定義的規則就是所謂的協議,每個使用tcp的項目都可能會定義一套這樣的協議,基于tcp衍生了非常多的協議,比如http,rpc。tcp是傳輸層協議,而基于tcp造出來的http和各類rpc協議只是定義了不同消息格式的應用層協議
http協議
http協議又叫作超文本傳輸協議
rpc
遠程過程調用,本身并不是一個具體的協議,而是一種調用方式,就是希望像調用本地方法那樣調用遠程方法
一般的軟件,客戶但需要跟服務端建立連接收發消息,此時都會用到應用層協議,在這種cs架構下,可以使用自家造的rpc協議
但是瀏覽器,不僅要能訪問自家公司的服務器,還需要訪問其他公司的網站服務器,所以需要http統一標準。所以多年前,http主要用于bs架構,但是現在已經分的沒那么清除。
要向某個服務器發起請求,得先建立連接,所以得先知道ip地址和端口,找到服務對應的ip和端口的過程就是服務發現。http中你知道服務的域名即可通過dns服務去解析。rpc一般會有專門的中間服務去報仇服務名和ip信息
Http 1.1
一次一份是核心,因為發送一個http請求的時候,是需要等收到Http響應才可以發送下一個Http請求。一個網頁一般由多個文件組成,最基本的就是html css js和圖片文件。對于http協議來說,我們打開一個網頁需要進行tcp三次握手,建立起tcp連接,才正式進行請求,服務器會先發送html文件給我們,其他文件不會發送給我們,我們的瀏覽器在收到html文件以后根據html里面的內容,再向服務器以此請求css js等文件,整個過程都是瀏覽器在幫我們完成,所以對用戶的直接感受就是只有一次請求,如果在請求隊伍里,有一個文件沒有收到,后面的文件也沒法接收了,這就會造成http隊頭阻塞。對于http1.1來說默認是持久連接的,即保持這個tcp連接,不需要對每個請求再來一輪tcp握手,請求和響應都放在同一個連接里面,但是只有一個連接肯定太慢了,連接太多又怕會造成DDos攻擊,因此各家瀏覽器允許的持久連接數都不太相同
瀏覽器會限制同一連接的請求數,限制每個域的連接數