Android基礎(chǔ)(10)—你需要知道的HTTP(S)、TCP、UDP

HTTP(S)

介紹

HTTP--Hyper Text Transfer Protocol,超文本傳輸協(xié)議,是一種建立在TCP上的無狀態(tài)連接,整個(gè)基本的工作流程是客戶端發(fā)送一個(gè)HTTP請求,說明客戶端想要訪問的資源和請求的動作,服務(wù)端收到請求之后,服務(wù)端開始處理請求,并根據(jù)請求做出相應(yīng)的動作訪問服務(wù)器資源,最后通過發(fā)送HTTP響應(yīng)把結(jié)果返回給客戶端。其中一個(gè)請求的開始到一個(gè)響應(yīng)的結(jié)束稱為事務(wù),當(dāng)一個(gè)事物結(jié)束后還會在服務(wù)端添加一條日志條目。

HTTP請求

HTTP請求是客戶端往服務(wù)端發(fā)送請求動作,告知服務(wù)器自己的要求。HTTP請求由狀態(tài)行、請求頭、請求正文三部分組成:

狀態(tài)行:包括請求方式Method、資源路徑URL、協(xié)議版本Version;

請求頭:包括一些訪問的域名、用戶代理、Cookie等信息;

請求正文:就是HTTP請求的數(shù)據(jù)。

請求方式Method一般有GET、POST、PUT、DELETE,含義分別是獲取、修改、上傳、刪除,其中GET方式僅僅為獲取服務(wù)器資源,方式較為簡單,因此在請求方式為GET的HTTP請求數(shù)據(jù)中,請求正文部分可以省略,直接將想要獲取的資源添加到URL中。

下圖為POST請求的格式,有狀態(tài)行、請求頭、請求正文三部分:

Post請求.png

HTTP響應(yīng)

響應(yīng)數(shù)據(jù)格式

服務(wù)器收到了客戶端發(fā)來的HTTP請求后,根據(jù)HTTP請求中的動作要求,服務(wù)端做出具體的動作,將結(jié)果回應(yīng)給客戶端,稱為HTTP響應(yīng)。HTTP響應(yīng)由三部分組成:狀態(tài)行、響應(yīng)頭、響應(yīng)正文;

狀態(tài)行:包括協(xié)議版本Version、狀態(tài)碼Status Code、回應(yīng)短語;

響應(yīng)頭:包括搭建服務(wù)器的軟件,發(fā)送響應(yīng)的時(shí)間,回應(yīng)數(shù)據(jù)的格式等信息;

響應(yīng)正文:就是響應(yīng)的具體數(shù)據(jù)。

狀態(tài)碼 含義
1xx 表示HTTP請求已經(jīng)接受,繼續(xù)處理請求
2xx 表示HTTP請求已經(jīng)處理完成
3xx 表示把請求訪問的URL重定向到其他目錄
4xx 表示客戶端出現(xiàn)錯(cuò)誤
5xx 表示服務(wù)端出現(xiàn)錯(cuò)誤

常見狀態(tài)碼含義

常見狀態(tài)碼 含義
200 OK/請求已經(jīng)正常處理完畢
301 請求永久重定向
302 請求臨時(shí)重定向
304 請求被重定向到客戶端本地緩存
400 客戶端請求存在語法錯(cuò)誤
401 客戶端請求沒有經(jīng)過授權(quán)
403 客戶端的請求被服務(wù)器拒絕,一般為客戶端沒有訪問權(quán)限
404 客戶端請求的URL服務(wù)端不存在
500 服務(wù)端永久錯(cuò)誤
503 服務(wù)端發(fā)生臨時(shí)錯(cuò)誤

HTTP響應(yīng)模型

服務(wù)器收到HTTP請求之后,會有多種方法響應(yīng)這個(gè)請求,下面是HTTP響應(yīng)的四種模型:

單進(jìn)程I/O模型

服務(wù)端開啟一個(gè)進(jìn)程,一個(gè)進(jìn)程僅能處理一個(gè)請求,并且對請求順序處理;

多進(jìn)程I/O模型

服務(wù)端并行開啟多個(gè)進(jìn)程,同樣的一個(gè)進(jìn)程只能處理一個(gè)請求,這樣服務(wù)端就可以同時(shí)處理多個(gè)請求;

復(fù)用I/O模型

服務(wù)端開啟一個(gè)進(jìn)程,但可以同時(shí)開啟多個(gè)線程,一個(gè)線程響應(yīng)一個(gè)請求,同樣可以達(dá)到同時(shí)處理多個(gè)請求,線程間并發(fā)執(zhí)行;

復(fù)用多線程I/O模型

服務(wù)端并行開啟多個(gè)進(jìn)程,同時(shí)每個(gè)進(jìn)程開啟多個(gè)線程,這樣服務(wù)端可以同時(shí)處理進(jìn)程數(shù)M*每個(gè)進(jìn)程的線程數(shù)N個(gè)請求。

HTTP報(bào)文格式

HTTP報(bào)文是HTTP應(yīng)用程序之間傳輸?shù)臄?shù)據(jù)塊,HTTP報(bào)文分為HTTP請求報(bào)文和HTTP響應(yīng)報(bào)文,但是無論哪種報(bào)文,他的整體格式是類似的,大致都是由起始、首部、主體三部分組成,起始說明報(bào)文的動作,首部說明報(bào)文的屬性,主體則是報(bào)文的數(shù)據(jù)。接下來具體說明。

HTTP請求報(bào)文

請求報(bào)文.png

請求報(bào)文的起始由請求行構(gòu)成(有些資料稱為狀態(tài)行,名字不一樣而已,都是指的一個(gè)東西),用來說明該請求想要做什么,由<Method、<URL、<Version 三個(gè)字段組成,注意每個(gè)字段之間都有一個(gè)空格。其中<Method字段有不同的值:

Method 含義
GET 訪問服務(wù)器的資源
POST 向服務(wù)器發(fā)送要修改的數(shù)據(jù)
HEAD 獲取服務(wù)器文檔的首部
PUT 向服務(wù)器上傳資源
DELETE 刪除服務(wù)器的資源

<URL字段表示服務(wù)器的資源目錄定位

<Version字段表示使用的HTTP協(xié)議版本

首部部分由多個(gè)請求頭(首部行)構(gòu)成,部分首部字段名如下:

首部字段名 含義
Accept 指定客戶端能夠接收的內(nèi)容格式類型
Accept-Language 指定客戶端能夠接受的語言類型
Accept-Ecoding 指定客戶端能夠接受的編碼類型
User-Agent 用戶代理,向服務(wù)器說明自己的操作系統(tǒng)、瀏覽器等信息
Connection 是否開啟持久連接(keep-alive)
Host 服務(wù)器域名

主體部分就是報(bào)文的具體數(shù)據(jù)。

HTTP響應(yīng)報(bào)文

響應(yīng)報(bào)文.png

響應(yīng)報(bào)文的起始由狀態(tài)行構(gòu)成,用來說明服務(wù)器做了什么,由<Version、<Status-Code、<Phrase三個(gè)字段組成,同樣的每個(gè)字段之間留有空格;首部由多個(gè)響應(yīng)頭(也叫首部行)組成,部分首部字段名如下:

首部字段名 含義
Server 服務(wù)器軟件名,Apache/Nginx
Date 服務(wù)器發(fā)出響應(yīng)報(bào)文的時(shí)間
Last-Modified 請求資源的最后的修改時(shí)間

主體部分是響應(yīng)報(bào)文的具體數(shù)據(jù)。

HTTP協(xié)議版本更替

HTTP/0.9

HTTP協(xié)議的最初版本,功能簡陋,僅支持請求方式GET,并且僅能請求訪問HTML格式的資源。

HTTP/1.0

在0.9版本上做了進(jìn)步,增加了請求方式POST和HEAD;不再局限于0.9版本的HTML格式,根據(jù)Content-Type可以支持多種數(shù)據(jù)格式,即MIME多用途互聯(lián)網(wǎng)郵件擴(kuò)展,例如text/html、image/jpeg等;同時(shí)也開始支持cache,就是當(dāng)客戶端在規(guī)定時(shí)間內(nèi)訪問統(tǒng)一網(wǎng)站,直接訪問cache即可。

但是1.0版本的工作方式是每次TCP連接只能發(fā)送一個(gè)請求,當(dāng)服務(wù)器響應(yīng)后就會關(guān)閉這次連接,下一個(gè)請求需要再次建立TCP連接,就是不支持keep-alive。

HTTP/1.1

解決了1.0版本的keep-alive問題,1.1版本加入了持久連接,一個(gè)TCP連接可以允許多個(gè)HTTP請求; 加入了管道機(jī)制,一個(gè)TCP連接同時(shí)允許多個(gè)請求同時(shí)發(fā)送,增加了并發(fā)性;新增了請求方式PUT、PATCH、DELETE等.

但是還存在一些問題,服務(wù)端是按隊(duì)列順序處理請求的,假如一個(gè)請求處理時(shí)間很長,則會導(dǎo)致后邊的請求無法處理,這樣就造成了隊(duì)頭阻塞的問題;同時(shí)HTTP是無狀態(tài)的連接,因此每次請求都需要添加重復(fù)的字段,降低了帶寬的利用率。

HTTP/2.0

為了解決1.1版本利用率不高的問題,提出了HTTP/2.0版本。增加雙工模式,即不僅客戶端能夠同時(shí)發(fā)送多個(gè)請求,服務(wù)端也能同時(shí)處理多個(gè)請求,解決了隊(duì)頭堵塞的問題;HTTP請求和響應(yīng)中,狀態(tài)行和請求/響應(yīng)頭都是些信息字段,并沒有真正的數(shù)據(jù),因此在2.0版本中將所有的信息字段建立一張表,為表中的每個(gè)字段建立索引,客戶端和服務(wù)端共同使用這個(gè)表,他們之間就以索引號來表示信息字段,這樣就避免了1.0舊版本的重復(fù)繁瑣的字段,并以壓縮的方式傳輸,提高利用率。另外也增加服務(wù)器推送的功能,即不經(jīng)請求服務(wù)端主動向客戶端發(fā)送數(shù)據(jù)。

當(dāng)前主流的協(xié)議版本還是HTTP/1.1版本。

網(wǎng)絡(luò)訪問量

IP:IP訪問量

相同的公網(wǎng)IP計(jì)算一次,就是同一個(gè)局域網(wǎng)內(nèi)的所有用戶訪問一個(gè)網(wǎng)站,但是他們都是借助一個(gè)公網(wǎng)IP去訪問那個(gè)網(wǎng)站的(NAT),因此這也只能算作一個(gè)IP訪問量。換一次公網(wǎng)IP則會加1。

PV:網(wǎng)頁訪問量

用戶訪問的頁面數(shù)就是PV訪問量,同一個(gè)局域網(wǎng)的不同用戶,而且就算是同一個(gè)用戶,只要刷新一次網(wǎng)站頁面,PV訪問量就加1,三個(gè)訪問量的值往往數(shù)PV的值最大。

UV:訪客訪問量

這里的訪客不是用戶,而是電腦,一臺電腦算一個(gè)訪客,即使是同一臺電腦的不同用戶,訪問同一個(gè)網(wǎng)站UV也只能加1,只有更換電腦才會使UV加1,因?yàn)榉?wù)端會記錄客戶端電腦的信息。

HTTPS

介紹

HTTPS是以安全為目標(biāo)的HTTP通道,是HTTP的安全版,即HTTP下加入SSL層,HTTPS的安全基礎(chǔ)是SSL,因此加密的詳細(xì)內(nèi)容就需要SSL。HTTPS協(xié)議的主要作用可以分為兩種:一種是建立一個(gè)信息安全通道,來保證數(shù)據(jù)傳輸?shù)陌踩涣硪环N就是確認(rèn)網(wǎng)站的真實(shí)性。

HTTP與HTTPS的區(qū)別

1.HTTPS協(xié)議需要到ca申請證書,一般免費(fèi)證書較少,因而需要一定費(fèi)用。

2.HTTP是超文本傳輸協(xié)議,信息是明文傳輸,HTTPS則是具有安全性的SSL加密傳輸協(xié)議。

3.HTTP和HTTPS使用的是完全不同的連接方式,用的端口也不一樣,前者是80,后者是443。

4.HTTP的連接很簡單,是無狀態(tài)的;HTTPS協(xié)議是由SSL+HTTP協(xié)議構(gòu)建的可進(jìn)行加密傳輸、身份認(rèn)證的網(wǎng)絡(luò)協(xié)議,比HTTP協(xié)議安全。

HTTPS的工作原理

HTTPS工作原理.png

客戶端在使用HTTPS方式與Web服務(wù)器通信時(shí)有以下幾個(gè)步驟:

1.客戶使用HTTPS的URL訪問Web服務(wù)器,要求與Web服務(wù)器建立SSL連接。

2.Web服務(wù)器收到客戶端請求后,會將網(wǎng)站的證書信息(證書中包含公鑰)傳送一份給客戶端。

3.客戶端的瀏覽器與Web服務(wù)器開始協(xié)商SSL連接的安全等級,也就是信息加密的等級。

4.客戶端的瀏覽器根據(jù)雙方同意的安全等級,建立會話密鑰,然后利用網(wǎng)站的公鑰將會話密鑰加密,并傳送給網(wǎng)站。

5.Web服務(wù)器利用自己的私鑰解密出會話密鑰。

6.Web服務(wù)器利用會話密鑰加密與客戶端之間的通信。

HTTPS的優(yōu)缺點(diǎn)

優(yōu)點(diǎn)

1.使用HTTPS協(xié)議可認(rèn)證用戶和服務(wù)器,確保數(shù)據(jù)發(fā)送到正確的客戶機(jī)和服務(wù)器;

2.HTTPS協(xié)議是由SSL+HTTP協(xié)議構(gòu)建的可進(jìn)行加密傳輸、身份認(rèn)證的網(wǎng)絡(luò)協(xié)議,要比http協(xié)議安全,可防止數(shù)據(jù)在傳輸過程中不被竊取、改變,確保數(shù)據(jù)的完整性。

3.HTTPS是現(xiàn)行架構(gòu)下最安全的解決方案,雖然不是絕對安全,但它大幅增加了中間人攻擊的成本。

4.谷歌曾在2014年8月份調(diào)整搜索引擎算法,并稱“比起同等HTTP網(wǎng)站,采用HTTPS加密的網(wǎng)站在搜索結(jié)果中的排名將會更高”。

缺點(diǎn)

1.HTTPS協(xié)議握手階段比較費(fèi)時(shí),會使頁面的加載時(shí)間延長近50%,增加10%到20%的耗電;

2.HTTPS連接緩存不如HTTP高效,會增加數(shù)據(jù)開銷和功耗,甚至已有的安全措施也會因此而受到影響;

3.SSL證書需要錢,功能越強(qiáng)大的證書費(fèi)用越高,個(gè)人網(wǎng)站、小網(wǎng)站沒有必要一般不會用。

4.SSL證書通常需要綁定IP,不能在同一IP上綁定多個(gè)域名,IPv4資源不可能支撐這個(gè)消耗。

5.HTTPS協(xié)議的加密范圍也比較有限,在黑客攻擊、拒絕服務(wù)攻擊、服務(wù)器劫持等方面幾乎起不到什么作用。最關(guān)鍵的,SSL證書的信用鏈體系并不安全,特別是在某些國家可以控制CA根證書的情況下,中間人攻擊一樣可行。

Socket

介紹

Socket是應(yīng)用層與TCP/IP協(xié)議族通信的中間軟件抽象層,它是一組接口。在設(shè)計(jì)模式中,Socket其實(shí)就是一個(gè)門面模式,它把復(fù)雜的TCP/IP協(xié)議族隱藏在Socket接口后面,對用戶來說,一組簡單的接口就是全部,讓Socket去組織數(shù)據(jù),以符合指定的協(xié)議。

圖解

Socket圖解.png

通信步驟

Socket通信步驟.png

例子

client

public class Client {

    public static void main(String[] args) throws Exception {
        ServerSocket server_socket = new ServerSocket(8080);
        Socket socket = server_socket.accept();
        InputStream inputStream = socket.getInputStream();
        BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream));
        String str;
        while ((str = reader.readLine()) != null) {
            System.out.println("我是服務(wù)端,我收到的消息是:" + str);
        }
        //用完關(guān)閉
        reader.close();
        inputStream.close();
        socket.close();
        server_socket.close();

    }
}

server

public class Server {

    public static void main(String[] args) throws Exception{
        Socket server_socket = new Socket("127.0.0.1",8080);
        BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(server_socket.getOutputStream()));
        writer.write("你好,jimyoungwei ,這里是客戶端給你發(fā)的消息。");
        writer.flush();
        writer.close();
        server_socket.close();
    }
}

先運(yùn)行client,再運(yùn)行server,運(yùn)行結(jié)果:

/Library/Java/JavaVirtualMachines/jdk-11.0.1.jdk/Contents/Home/bin/java "-javaagent:/Applications/IntelliJ IDEA CE.app/Contents/lib/idea_rt.jar=62225:/Applications/IntelliJ IDEA CE.app/Contents/bin" -Dfile.encoding=UTF-8 -classpath /Users/jimyoungwei/IdeaProjects/SocketTest/out/production/SocketTest com.jimyoungwei.Client
我是服務(wù)端,我收到的消息是:你好,jimyoungwei ,這里是客戶端給你發(fā)的消息。

Process finished with exit code 0

TCP/UDP

基本認(rèn)知

TCP和UDP是OSI模型中的運(yùn)輸層中的協(xié)議。TCP提供可靠的通信傳輸,而UDP則常被用于讓廣播和細(xì)節(jié)控制交給應(yīng)用的通信傳輸。

TCP(Transmission Control Protocol,傳輸控制協(xié)議):

連接三次握手:

TCP三次握手.png

第一次握手:Client將標(biāo)志位SYN置為1,隨機(jī)產(chǎn)生一個(gè)值seq=J,并將該數(shù)據(jù)包發(fā)送給Server,Client進(jìn)入SYN_SENT狀態(tài),等待Server確認(rèn)。

第二次握手:Server收到數(shù)據(jù)包后由標(biāo)志位SYN=1知道Client請求建立連接,Server將標(biāo)志位SYN和ACK都置為1,ack=J+1,隨機(jī)產(chǎn)生一個(gè)值seq=K,并將該數(shù)據(jù)包發(fā)送給Client以確認(rèn)連接請求,Server進(jìn)入SYN_RCVD狀態(tài)。

第三次握手:Client收到確認(rèn)后,檢查ack是否為J+1,ACK是否為1,如果正確則將標(biāo)志位ACK置為1,ack=K+1,并將該數(shù)據(jù)包發(fā)送給Server,Server檢查ack是否為K+1,ACK是否為1,如果正確則連接建立成功,Client和Server進(jìn)入ESTABLISHED狀態(tài),完成三次握手,隨后Client與Server之間可以開始傳輸數(shù)據(jù)了。

斷開四次分手:

TCP四次分手.png

第一次揮手:Client發(fā)送一個(gè)FIN,用來關(guān)閉Client到Server的數(shù)據(jù)傳送,Client進(jìn)入FIN_WAIT_1狀態(tài)。

第二次揮手:Server收到FIN后,發(fā)送一個(gè)ACK給Client,確認(rèn)序號為收到序號+1(與SYN相同,一個(gè)FIN占用一個(gè)序號),Server進(jìn)入CLOSE_WAIT狀態(tài)。

第三次揮手:Server發(fā)送一個(gè)FIN,用來關(guān)閉Server到Client的數(shù)據(jù)傳送,Server進(jìn)入LAST_ACK狀態(tài)。

第四次揮手:Client收到FIN后,Client進(jìn)入TIME_WAIT狀態(tài),接著發(fā)送一個(gè)ACK給Server,確認(rèn)序號為收到序號+1,Server進(jìn)入CLOSED狀態(tài),完成四次揮手。

名詞解析:

ACK :TCP報(bào)頭的控制位之一,對數(shù)據(jù)進(jìn)行確認(rèn).確認(rèn)由目的端發(fā)出,用它來告訴發(fā)送端這個(gè)序列號之前的數(shù)據(jù)段都收到了.比如,確認(rèn)號為X,則表示前X-1個(gè)數(shù)據(jù)段都收到了,只有當(dāng)ACK=1時(shí),確認(rèn)號才有效,當(dāng)ACK=0時(shí),確認(rèn)號無效,這時(shí)會要求重傳數(shù)據(jù),保證數(shù)據(jù)的完整性。

SYN : 同步序列號,TCP建立連接時(shí)將這個(gè)位置設(shè)置為1。

FIN :發(fā)送端完成發(fā)送任務(wù)后,當(dāng)TCP完成數(shù)據(jù)傳輸需要斷開時(shí),提出斷開連接的一方將其設(shè)置為1。

包頭結(jié)構(gòu):

源端口 16位
目標(biāo)端口 16位
序列號 32位
回應(yīng)序號 32位
TCP頭長度 4位
reserved 6位
控制代碼 6位
窗口大小 16位
偏移量 16位
校驗(yàn)和 16位
選項(xiàng) 32位(可選)
這樣我們得出了TCP包頭的最小長度,為20字節(jié)

UDP(User Data Protocol,用戶數(shù)據(jù)報(bào)協(xié)議):

特點(diǎn):

1.UDP是一個(gè)非連接的協(xié)議,傳輸數(shù)據(jù)之前源端和終端不建立連接,當(dāng)它想傳送時(shí)就簡單地去抓取來自應(yīng)用程序的數(shù)據(jù),并盡可能快地把它扔到網(wǎng)絡(luò)上。在發(fā)送端,UDP傳送數(shù)據(jù)的速度僅僅是受應(yīng)用程序生成數(shù)據(jù)的速度、計(jì)算機(jī)的能力和傳輸帶寬的限制;在接收端,UDP把每個(gè)消息段放在隊(duì)列中,應(yīng)用程序每次從隊(duì)列中讀一個(gè)消息段。

2.由于傳輸數(shù)據(jù)不建立連接,因此也就不需要維護(hù)連接狀態(tài),包括收發(fā)狀態(tài)等,因此一臺服務(wù)機(jī)可同時(shí)向多個(gè)客戶機(jī)傳輸相同的消息。

3.UDP信息包的標(biāo)題很短,只有8個(gè)字節(jié),相對于TCP的20個(gè)字節(jié)信息包的額外開銷很小。

4.吞吐量不受擁擠控制算法的調(diào)節(jié),只受應(yīng)用軟件生成數(shù)據(jù)的速率、傳輸帶寬、源端和終端主機(jī)性能的限制。

5.UDP使用盡最大努力交付,即不保證可靠交付,因此主機(jī)不需要維持復(fù)雜的鏈接狀態(tài)表(這里面有許多參數(shù))。

6.UDP是面向報(bào)文的。發(fā)送方的UDP對應(yīng)用程序交下來的報(bào)文,在添加首部后就向下交付給IP層。既不拆分,也不合并,而是保留這些報(bào)文的邊界,因此,應(yīng)用程序需要選擇合適的報(bào)文大小。

使用“ping”命令來測試兩臺主機(jī)之間TCP/IP通信是否正常,其實(shí)“ping”命令的原理就是向?qū)Ψ街鳈C(jī)發(fā)送UDP數(shù)據(jù)包,然后對方主機(jī)確認(rèn)收到數(shù)據(jù)包,如果數(shù)據(jù)包是否到達(dá)的消息及時(shí)反饋回來,那么網(wǎng)絡(luò)就是通的。

包頭結(jié)構(gòu):

源端口 16位
目的端口 16位
長度 16位
校驗(yàn)和 16位

優(yōu)點(diǎn)

TCP:

可靠,穩(wěn)定 TCP的可靠體現(xiàn)在TCP在傳遞數(shù)據(jù)之前,會有三次握手來建立連接,而且在數(shù)據(jù)傳遞時(shí),有確認(rèn)、窗口、重傳、擁塞控制機(jī)制,在數(shù)據(jù)傳完后,還會斷開連接用來節(jié)約系統(tǒng)資源。

UDP:

快,比TCP稍安全 UDP沒有TCP的握手、確認(rèn)、窗口、重傳、擁塞控制等機(jī)制,UDP是一個(gè)無狀態(tài)的傳輸協(xié)議,所以它在傳遞數(shù)據(jù)時(shí)非???。沒有TCP的這些機(jī)制,UDP較TCP被攻擊者利用的漏洞就要少一些。但UDP也是無法避免攻擊的,比如:UDP Flood攻擊。

缺點(diǎn)

TCP:

慢,效率低,占用系統(tǒng)資源高,易被攻擊 。TCP在傳遞數(shù)據(jù)之前,要先建連接,這會消耗時(shí)間,而且在數(shù)據(jù)傳遞時(shí),確認(rèn)機(jī)制、重傳機(jī)制、擁塞控制機(jī)制等都會消耗大量的時(shí)間,而且要在每臺設(shè)備上維護(hù)所有的傳輸連接,事實(shí)上,每個(gè)連接都會占用系統(tǒng)的CPU、內(nèi)存等硬件資源。 而且,因?yàn)門CP有確認(rèn)機(jī)制、三次握手機(jī)制,這些也導(dǎo)致TCP容易被人利用,實(shí)現(xiàn)DOS、DDOS、CC等攻擊。

UDP:

不可靠,不穩(wěn)定。 因?yàn)閁DP沒有TCP那些可靠的機(jī)制,在數(shù)據(jù)傳遞時(shí),如果網(wǎng)絡(luò)質(zhì)量不好,就會很容易丟包。

應(yīng)用場景

TCP:

當(dāng)對網(wǎng)絡(luò)通訊質(zhì)量有要求的時(shí)候,比如:整個(gè)數(shù)據(jù)要準(zhǔn)確無誤的傳遞給對方,這往往用于一些要求可靠的應(yīng)用,比如HTTP、HTTPS、FTP等傳輸文件的協(xié)議,POP、SMTP等郵件傳輸?shù)膮f(xié)議。 在日常生活中,常見使用TCP協(xié)議的應(yīng)用如下: 瀏覽器用的HTTP FlashFXP,用的FTP Outlook、用的POP、SMTP Putty,用的Telnet、SSH QQ文件傳輸 ……

UDP:

面向數(shù)據(jù)報(bào)方式,網(wǎng)絡(luò)數(shù)據(jù)大多為短消息,擁有大量Client,對數(shù)據(jù)安全性無特殊要求,網(wǎng)絡(luò)負(fù)擔(dān)非常重,但對響應(yīng)速度要求高,這時(shí)就可以使用UDP。 比如,日常生活中,常見使用UDP協(xié)議的應(yīng)用如下: QQ語音 、QQ視頻 、TFTP ……

網(wǎng)絡(luò)編程

具體編程時(shí)區(qū)別:

1.socket()的參數(shù)不同。

2.UDP Server不需要調(diào)用listen和accept 。

3.UDP收發(fā)數(shù)據(jù)用sendto/recvfrom函數(shù) 。

4.TCP:地址信息在connect/accept時(shí)確定 。

5.UDP:在sendto/recvfrom函數(shù)中每次均 需指定地址信息 。

6.UDP:shutdown函數(shù)無效。

服務(wù)器端編程一般步驟:

TCP:

1、創(chuàng)建一個(gè)socket,用函數(shù)socket()。

2、設(shè)置socket屬性,用函數(shù)setsockopt(); * 可選 。

3、綁定IP地址、端口等信息到socket上,用函數(shù)bind()。

4、開啟監(jiān)聽,用函數(shù)listen()。

5、接收客戶端上來的連接,用函數(shù)accept()。

6、收發(fā)數(shù)據(jù),用函數(shù)send()和recv(),或者read()和write()。

7、關(guān)閉網(wǎng)絡(luò)連接。

8、關(guān)閉監(jiān)聽。

UDP:

1、創(chuàng)建一個(gè)socket,用函數(shù)socket()。

2、設(shè)置socket屬性,用函數(shù)setsockopt();* 可選 。

3、綁定IP地址、端口等信息到socket上,用函數(shù)bind()。

4、循環(huán)接收數(shù)據(jù),用函數(shù)recvfrom()。

5、關(guān)閉網(wǎng)絡(luò)連接。

客戶端編程一般步驟:

TCP:

1、創(chuàng)建一個(gè)socket,用函數(shù)socket()。

2、設(shè)置socket屬性,用函數(shù)setsockopt();* 可選 。

3、綁定IP地址、端口等信息到socket上,用函數(shù)bind();* 可選 。

4、設(shè)置要連接的對方的IP地址和端口等屬性。

5、連接服務(wù)器,用函數(shù)connect()。

6、收發(fā)數(shù)據(jù),用函數(shù)send()和recv(),或者read()和write()。

7、關(guān)閉網(wǎng)絡(luò)連接。

UDP:

1、創(chuàng)建一個(gè)socket,用函數(shù)socket()。

2、設(shè)置socket屬性,用函數(shù)setsockopt();* 可選 。

3、綁定IP地址、端口等信息到socket上,用函數(shù)bind();* 可選 。

4、設(shè)置對方的IP地址和端口等屬性。

5、發(fā)送數(shù)據(jù),用函數(shù)sendto()。

6、關(guān)閉網(wǎng)絡(luò)連接。

區(qū)別

1、TCP面向連接(如打電話要先撥號建立連接);UDP是無連接的,即發(fā)送數(shù)據(jù)之前不需要建立連接。

2、TCP提供可靠的服務(wù)。通過TCP連接傳送的數(shù)據(jù),無差錯(cuò),不丟失,不重復(fù),且按序到達(dá);UDP盡最大努力交付,即不保證可靠交付。

3、TCP面向字節(jié)流,實(shí)際上是TCP把數(shù)據(jù)看成一連串無結(jié)構(gòu)的字節(jié)流;UDP是面向報(bào)文的。UDP沒有擁塞控制,因此網(wǎng)絡(luò)出現(xiàn)擁塞不會使源主機(jī)的發(fā)送速率降低(對實(shí)時(shí)應(yīng)用很有用,如IP電話,實(shí)時(shí)視頻會議等)。

4、每一條TCP連接只能是點(diǎn)到點(diǎn)的;UDP支持一對一,一對多,多對一和多對多的交互通信。

5、TCP首部開銷20字節(jié);UDP的首部開銷小,只有8個(gè)字節(jié)。

6、TCP的邏輯通信信道是全雙工的可靠信道,UDP則是不可靠信道。


上一篇:Android基礎(chǔ)(9)—多線程和異步任務(wù)
下一篇:Android基礎(chǔ)(11)—你需要知道的內(nèi)存知識

精彩內(nèi)容不夠看?更多精彩內(nèi)容,請到微信搜索 “危君子頻道” 訂閱號,每周更新,歡迎大家關(guān)注訂閱!

微信公眾號
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

友情鏈接更多精彩內(nèi)容