網(wǎng)絡(luò)通信系列文章序
徹底掌握網(wǎng)絡(luò)通信(一)Http協(xié)議基礎(chǔ)知識(shí)
徹底掌握網(wǎng)絡(luò)通信(二)Apache的HttpClient基礎(chǔ)知識(shí)
徹底掌握網(wǎng)絡(luò)通信(三)Android源碼中HttpClient的在不同版本的使用
徹底掌握網(wǎng)絡(luò)通信(四)Android源碼中HttpClient的發(fā)送框架解析
徹底掌握網(wǎng)絡(luò)通信(五)DefaultRequestDirector解析
徹底掌握網(wǎng)絡(luò)通信(六)HttpRequestRetryHandler解析
徹底掌握網(wǎng)絡(luò)通信(七)ConnectionReuseStrategy,ConnectionKeepAliveStrategy解析
徹底掌握網(wǎng)絡(luò)通信(八)AsyncHttpClient源碼解讀
徹底掌握網(wǎng)絡(luò)通信(九)AsyncHttpClient為什么無法用Fiddler來抓包
徹底掌握網(wǎng)絡(luò)通信(十)AsyncHttpClient如何發(fā)送JSON解析JSON,以及一些其他用法
這是一個(gè)系列文章,主要帶讀者徹底理清httpclient和asynchttpclient环葵。比如在底層他是怎么發(fā)送請(qǐng)求的懂鸵,怎么和socket關(guān)聯(lián)的址貌?consumeContent導(dǎo)致的異掣… …
先補(bǔ)充下基礎(chǔ)知識(shí):
1)HTTP協(xié)議
超文本傳輸協(xié)議(HTTP)是一種通信協(xié)議耻姥,歸屬于應(yīng)用層協(xié)議方庭,主要解決如何包裝數(shù)據(jù)厕吉。它允許將超文本標(biāo)記語言(HTML)文檔從Web服務(wù)器傳送到客戶端的瀏覽器。http協(xié)議是無狀態(tài)的械念,同一個(gè)客戶端的這次請(qǐng)求和上次請(qǐng)求是沒有對(duì)應(yīng)關(guān)系头朱,對(duì)http服務(wù)器來說,它并不知道這兩個(gè)請(qǐng)求來自同一個(gè)客戶端龄减。 為了解決這個(gè)問題项钮, Web程序引入了Cookie機(jī)制來維護(hù)狀態(tài).
2)什么是TCP/IP
TCP/IP是一個(gè)協(xié)議族,由底層的IP協(xié)議和TCP協(xié)議組成的;其全稱為(Transmission Control Protocol/Internet Protocol)即傳輸控制協(xié)議/網(wǎng)間協(xié)議烁巫。
TCP協(xié)議:是一種面向連接的署隘、可靠的、基于字節(jié)流的傳輸層通信協(xié)議亚隙;
IP協(xié)議:將多個(gè)包交換網(wǎng)絡(luò)連接起來磁餐,它在源地址和目的地址之間傳送一種稱之為數(shù)據(jù)包的東西,它還提供對(duì)數(shù)據(jù)大小的重新組裝功能阿弃,以適應(yīng)不同網(wǎng)絡(luò)對(duì)包大小的要求诊霹。
IP不提供可靠的傳輸服務(wù),它不提供端到端的或(路由)結(jié)點(diǎn)到(路由)結(jié)點(diǎn)的確認(rèn)渣淳,對(duì)數(shù)據(jù)沒有差錯(cuò)控制脾还,它只使用報(bào)頭的校驗(yàn)碼,它不提供重發(fā)和流量控制入愧;
3)什么是OSI
OSI(Open System Interconnect)鄙漏,即開放式系統(tǒng)互聯(lián)。 一般都叫OSI參考模型砂客,是ISO(國(guó)際標(biāo)準(zhǔn)化組織)組織在1985年研究的網(wǎng)絡(luò)互連模型
OSI參考模型和TCP/IP網(wǎng)絡(luò)模型
4)什么是HTTP/2
HTTP/2 (原名HTTP/2.0)即超文本傳輸協(xié)議 2.0泥张,是下一代HTTP協(xié)議。在開放互聯(lián)網(wǎng)上HTTP 2.0將只用于https://網(wǎng)址鞠值,而 http://網(wǎng)址將繼續(xù)使用HTTP/1
5)URL詳解
基本格式如下
schema://host[:port#]/path/…/[?query-string][#anchor]
scheme 指定低層使用的協(xié)議(例如:http, https, ftp)
host HTTP服務(wù)器的IP地址或者域名
port# HTTP服務(wù)器的默認(rèn)端口是80媚创,這種情況下端口號(hào)可以省略。如果使用了別的端口彤恶,必須指明
path 訪問資源的路徑
query-string 發(fā)送給http服務(wù)器的數(shù)據(jù)
anchor- 錨
5.1)從上面的URL中可以看出這是一個(gè)典型的Get請(qǐng)求的樣例钞钙,其中scheme即指httpclient,asynchttpclient中的Scheme.java,他表示請(qǐng)求使用的協(xié)議声离,同時(shí)我們也會(huì)使用到SchemeRegistry.java芒炼,該類里面有一個(gè)Map型變量registeredSchemes用于添加scheme
5.2)host的使用我們會(huì)在httpclient,asynchttpclient中的HttpHost.java中得到體現(xiàn)
6)request消息結(jié)構(gòu)和respone消息結(jié)構(gòu)
Request消息分為3部分,第一部分叫Request line, 第二部分叫Request header, 第三部分是body. header和body之間有個(gè)空行术徊;
respone消息分為3部分本刽,第一部分叫Response line, 第二部分叫Response header,第三部分是body. header和body之間也有個(gè)空行
7)HTTP協(xié)議是無狀態(tài)的和Connection: keep-alive的區(qū)別
無狀態(tài)是指協(xié)議對(duì)于事務(wù)處理沒有記憶能力赠涮,同一個(gè)客戶端的這次請(qǐng)求和上次請(qǐng)求是沒有對(duì)應(yīng)關(guān)系子寓,對(duì)http服務(wù)器來說,它并不知道這兩個(gè)請(qǐng)求來自同一個(gè)客戶端笋除;
無狀態(tài)不代表HTTP不能保持TCP連接斜友,更不能代表HTTP使用的是UDP協(xié)議(無連接)
從HTTP/1.1起,默認(rèn)都開啟了Keep-Alive垃它,保持連接特性鲜屏,簡(jiǎn)單地說烹看,當(dāng)一個(gè)網(wǎng)頁(yè)打開完成后,客戶端和服務(wù)器之間用于傳輸HTTP數(shù)據(jù)的TCP連接不會(huì)關(guān)閉洛史,如果客戶端再次訪問這個(gè)服務(wù)器上的網(wǎng)頁(yè)惯殊,會(huì)繼續(xù)使用這一條已經(jīng)建立的連接
Keep-Alive不會(huì)永久保持連接,它有一個(gè)保持時(shí)間也殖,可以在不同的服務(wù)器軟件(如Apache)中設(shè)定這個(gè)時(shí)間
---------------------
作者:yi_master
來源:CSDN
原文:https://blog.csdn.net/yi_master/article/details/79358920?utm_source=copy
版權(quán)聲明:本文為博主原創(chuàng)文章靠胜,轉(zhuǎn)載請(qǐng)附上博文鏈接!