1. 程式人生 > 其它 >如何解決error: failed to push some refs to ‘xxx(遠端庫)‘(圖文解說簡潔版)

如何解決error: failed to push some refs to ‘xxx(遠端庫)‘(圖文解說簡潔版)

HTTP報文

HTTP雖然被稱為超文字傳輸協議,但其本質上不管“傳輸”,將其交給TCP來做,而是在HTTP報文中定義一些列格式並規定了組成部分,解析規則以及處理策略,在TCP/IP層之上實現了更為靈活豐富的功能如:連線控制,快取控制,資料編碼,內容協商...總而言之,其精華部分在於報文內容

報文結構

HTTP協議請求報文和響應報文結構基本相同,由三大部分組成:

  • start line 起始行 : 描述請求和響應的基本資訊;

  • header 頭部欄位集合 : 使用key-value 的形勢更加詳細地說明報文;

  • entity 訊息正文 : 實際傳輸的資料,它不一定是純文字,可以是圖片,視訊等二進位制資料

Tips :可以沒有entity 但必須有header 和 start line

大體結構如下:
抓包詳情:

詳細結構

start line

請求報文中的請求行:

  • 請求方法: 是一個動詞 ,如GET/POST 表示對資源的操作;

  • 請求目標: 通常是一個 URI ,標記了請求方法要操作的資源;

  • 版本號: 表示報文使用的HTTP協議版本。

如下圖:

三個部分用空格分隔,末尾CRLF換行表示結束。

響應報文中的狀態行:

  • 版本號: 表示報文使用的HTTP協議版本;

  • 狀態碼: 一個三位數字,表示處理結果,如200成功;

  • 原因: 作為狀態碼的補充,是更加詳細的解釋文字,幫助人理解原因。

如下圖:

請求行或狀態行加上頭部欄位就構成了HTTP報文的請求頭和響應頭。結構如下圖所示:

請求頭:

響應頭:

頭部欄位都是以key-value的形式表達,key與value之間用':' 分隔 ,用CRLF換行表示欄位結束。

頭部欄位非常靈活,不僅可以使用標準裡面的Host,Connection等已有的鍵,我們還可以自定義key-value,給HTTP協議帶來了無限的擴充套件可能。

但有以下幾點需要注意:

  • 欄位名不區分大小寫,例如“Host”也可以寫成“host”,但首字母大寫的可讀性更好;

  • 欄位名裡不允許出現空格,可以使用連字元“-”,但不能使用下劃線“_”。例如,“test-name”是合法的欄位名,而“test name”“test_name”是不正確的欄位名;

  • 欄位名後面必須緊接著“:”,不能有空格,而“:”後的欄位值前可以有多個空格;

  • 欄位的順序是沒有意義的,可以任意排列不影響語義;

  • 欄位原則上不能重複,除非這個欄位本身的語義允許,例如 Set-Cookie。

常用頭欄位

HTTP 協議規定了非常多的頭部欄位,實現各種各樣的功能,但基本上可以分為四大類:

  1. 通用欄位:在請求頭和響應頭裡都可以出現;
  2. 請求欄位:僅能出現在請求頭裡,進一步說明請求資訊或者額外的附加條件;
  3. 響應欄位:僅能出現在響應頭裡,補充說明響應報文的資訊;
  4. 實體欄位:它實際上屬於通用欄位,但專門描述 body 的額外資訊。

先來介紹一些基礎的頭欄位:

  • Host : 它屬於請求欄位,只能出現在請求頭裡,它同時也是唯一一個 HTTP/1.1 規範裡要求必須出現的欄位,也就是說,如果請求頭裡沒有 Host,那這就是一個錯誤的報文。Host 欄位告訴伺服器這個請求應該由哪個主機來處理,當一臺計算機上託管了多個虛擬主機的時候,伺服器端就需要用 Host 欄位來選擇,有點像是一個簡單的“路由重定向”

  • User-Agent : 只出現在請求頭裡。它使用一個字串來描述發起 HTTP 請求的客戶端,伺服器可以依據它來返回最合適此瀏覽器顯示的頁面。

  • Date : 是一個通用欄位,但通常出現在響應頭裡,表示 HTTP 報文建立的時間,客戶端可以使用這個時間再搭配其他欄位決定快取策略。

  • Server : 是響應欄位,只能出現在響應頭裡。它告訴客戶端當前正在提供 Web 服務的軟體名稱和版本號,例如在我們的實驗環境裡它就是“Server: openresty/1.15.8.1”,即使用的是 OpenResty 1.15.8.1。

  • Content-Length : 它表示報文裡 body 的長度,也就是請求頭或響應頭空行後面資料的長度。伺服器看到這個欄位,就知道了後續有多少資料,可以直接接收。如果沒有這個欄位,那麼 body 就是不定長的,需要使用 chunked 方式分段傳輸。

Tips :

  1. 但由於歷史的原因,User-Agent 非常混亂,每個瀏覽器都自稱是“Mozilla”“Chrome”“Safari”,企圖使用這個欄位來互相“偽裝”,導致 User-Agent 變得越來越長,最終變得毫無意義。不過有的比較“誠實”的爬蟲會在 User-Agent 裡用“spider”標明自己是爬蟲,所以可以利用這個欄位實現簡單的反爬蟲策略。

  2. Server 欄位也不是必須要出現的,因為這會把伺服器的一部分資訊暴露給外界,如果這個版本恰好存在 bug,那麼黑客就有可能利用 bug 攻陷伺服器。所以,有的網站響應頭裡要麼沒有這個欄位,要麼就給出一個完全無關的描述資訊。比如 GitHub,它的 Server 欄位裡就看不出是使用了 Apache 還是 Nginx,只是顯示為“GitHub.com”。