繼續記筆記。。。
傳送門:java 8 中文版在線api學習手冊:http://www.matools.com/api/java8
網絡協議
網絡協議是在計算機網絡中進行數據交換時所必須遵守的規則的集合。也就是說,網絡協議包含了很多通信的規則。
首先,我們都知道很多設備/計算機相連組成的計算機網絡,那麼在這樣一個大網絡中,任意兩臺設備需要進行通信,是要遵循一定的規則才能進行信息交換,不然整個網絡的信息交換就會出現很混亂並且不可靠。比如你要打電話給甲,但是在由手機構成的大網絡裏面,你可能連接不上甲,又或者甲拒絕與你通信你卻不知道,又或者你們之間的聊天所有的人都可以聽到,爲了避免混亂,我們需要制定相應規則並遵守,才能維持良好的通信。
網絡協議的制定就是爲了能使網絡上各種設備能夠正確地相互交換信息。 它包含了很多類型,常見的協議有:TCP/IP協議、IPX/SPX協議、NetBEUI協議等。
TCP/UDP協議
我們都知道OSI的七層模型,而TCP/IP網絡模型就將網絡分成了五層,它與OSI模型有些類似,只是將表示層、會話層去掉,合併了數據鏈路層和物理層作爲網絡接口層。
對應TCP/IP網絡模型的協議就是TCP/IP協議。它是互聯網的基礎協議,任何和互聯網有關的操作都離不開TCP/IP協議。在TCP/IP協議網絡體系中,有包含一系列處理數據通信的協議:
- TCP協議(傳輸控制協議):應用程序之間可靠穩定的通信
- UDP協議(用戶數據報協議):應用程序之間簡單的通信
- IP協議 (網際協議):計算機之間的通信
- ICMP協議(因特網消息控制協議):主機和路由器之間傳遞控制消息的通信(專門針對通信錯誤和通信狀態的協議)
- DHCP協議(動態主機配置協議):局域網分配IP地址的協議(針對動態尋址)
其中,TCP和UDP是傳輸層最重要的兩個協議,它們爲上層用戶提供級別的通信可靠性。
TCP傳輸協議
TCP(Transfer Control Protocol)傳輸控制協議: 它定義了兩臺計算機之間進行可靠的通信連接協議。提供的是面向連接(連接導向)的,基於字節流的運輸層(Transport Layer)的通信協議。它的特點:
- 面向連接
- 點到點的通信
- 高可靠性
- 佔用系統資源多、效率低
TCP協議可靠,一對一,在傳遞數據之前需要三次握手來建立連接,而且在數據傳遞過程中,有確認、窗口、重傳、擁塞控制機制,傳完之後還需要四次揮手斷開連接。
下面簡單介紹一下著名的三次握手和四次揮手。
三次握手
假設A與B要建立TCP連接,簡單地過程是這樣的:
-
第一次握手:A–發送請求–>B
-
第二次握手:A<–確認A的請求併發送請求–B
-
第三次握手:A–確認B的請求–>B
哈哈哈哈,圖已經很形象了。如果還不能理解三次握手的話(認真學習的娃要看理論),那我們就從概念上理解,複雜地表述就是:在建立TCP連接之前,通信雙方也就是A和B必須要先了解對方四個信息:
- 對方報文發送的開始序號
- 對方發送數據的緩衝區大小
- 能被接收的最大報文段長度MSS
- 被支持的TCP選項
爲什麼要知道這四個信息呢?這跟傳輸時的TCP報文有關係。
TCP報文是TCP層傳輸的數據單元,也叫報文段。這裏有幾個重要的內容需要在傳輸時填寫的。
- 序號 :序號是報文段發送的第一個字節的序號,它確保了TCP傳輸的有序性
- 確認號 :即ACK,指明下一個期待收到的字節序號,並表明該序號之前的數據已經正確無誤的收到
- 控制位 :有6個,每一個標誌位表示一個控制功能
1)URG:緊急指針標誌,值爲1時表示緊急指針有效,爲0時則忽略緊急指針
2)ACK:確認序號標誌,值爲1時表示確認號有效,爲0時則報文中不含確認信息
3)PSH:push標誌,值爲1時表示接收方在接收到該報文段後,需要儘快將報文段交給應用程序,而不要放在緩衝區排隊等候,爲0時則忽略
4)RST:重置連接標誌,用於重置由於主機崩潰或其他原因而出現錯誤的連接,或者用於拒絕非法的報文段和拒絕連接請求
5)SYN:同步序號,用於建立連接過程
在連接請求中,SYN=1及ACK=0表示還沒收到確認信息,SYN=1且ACK=1,表示確認連接。
6)FIN:finish標誌,值爲1時表示發送方已經不發送數據,可關閉本次數據流,爲0時則忽略
圖來源:https://blog.csdn.net/paincupid/article/details/79726795
開始建立連接:
- 第一次握手: 建立連接時,A發送標誌位syn=1和隨機產生一個序列號seqA=k到B,進入SYN_SENT狀態,等待B確認;
- 第二次握手: B收到syn=1的請求,確認連接信息,並向A發送ACK=1,SYN=1,然後隨機產生序列號seqB=seqA+1,此時B進入SYN_RECV狀態;
- 第三次握手: A收到B的SYN+ACK,向B發送確認ACK,此標誌位發送完畢,A和B進入ESTABLISHED(TCP連接成功)狀態,完成三次握手。
四次揮手
斷開一個連接需要四次揮手,四次揮手的過程是:
官方說法:
- 第一次揮手: 當數據傳輸即將完成,A向B發送FIN=1的請求關閉標誌位,代表告訴B,這邊數據傳輸即將完成,準備關閉連接
- 第二次揮手: 當B收到A收到的FIN=1的標誌位後,會先發送一個ACK=1的應答信息;表達的意思是你的請求關閉我已收到啦,但我還有數據傳輸未搞定,待我搞定完再告訴你。
- 第三次揮手: B數據傳輸完成,向A發送FIN=1。
- 第四次揮手: A收到B發送的FIN=1後,還要考慮到網絡不穩定等原因,怕B不知道他要斷開連接,於是向B發送ACK=1確認信息進行確認,同時把自身狀態設置爲time_wait狀態,啓動計時器。如果B沒有收到A發送的ACK,則在計時器結束後會要求A再發送一次ACK,當B收到A的ack後,B斷開連接。
UDP傳輸協議
UDP(User Datagram Protocol)用戶數據報協議: 這是一個簡單的面向數據報的傳輸層協議,提供的是無連接、面向事務的簡單卻不可靠的信息傳送服務。它的特點:
- 非面向連接,傳輸不可靠,可能會丟失
- 發送不管對方是否準備好,接收方收到也不會確認
- 可以廣播發送
- 非常簡單的協議,開銷小
UDP是一種無需連接的協議,它與TCP協議一樣可用於處理數據包,但是它相對不可靠,也就是報文發送出去之後,發送方是不知道報文有沒有成功到達的。UDP支持一對一、多對一、多對多等方式,也就是單播,多播和廣播。
UDP的適用場景是:用於實時應用,比如視頻會議、直播等等。
套接字Socket
TCP和UDP都是屬於傳輸層的協議,而我們開發的網絡應用程序是位於應用層的,那麼在應用層,該如何使用傳輸層的服務?套接字就是解決這個問題的,有了它就能實現應用層和傳輸層分離。在java設計模式中,Socket就是接口。
應用層能通過Socket發送或者接收數據,並能對數據報文作讀寫、打開關閉等操作。同時Socket的存在,還允許應用程序直接將I/O插入到網絡中,實現與網絡中其他應用程序進行通信。
往後會結合Java類來介紹這些概念以及測試例子,這裏就先不展開關於socket編程的東西了。
總結
介紹了網絡編程中很重要的一部分:傳輸。傳輸要遵守一定的規則,這些規則就是我們的傳輸協議了。其中最有名的就是TCP/IP協議,當中還介紹了TCP的三次握手及四次揮手,還有UDP協議以及套接字的概念。今天的筆記就到這裏啦,後續再慢慢整理。。。
參考文章:
https://blog.csdn.net/paincupid/article/details/79726795
https://www.cnblogs.com/hnrainll/archive/2011/10/14/2212415.html
https://zhuanlan.zhihu.com/p/42224106
https://www.cnblogs.com/fundebug/p/differences-of-tcp-and-udp.html