Socket入門之前的知識點
- Socket難點
- 數據粘包
- 心跳維持
- 數據丟包
- 性能問題
7層網路模型-OSI
- 基礎層:物理層(Physical)、數據鏈路層(Datalink)、網路層(Network)
- 傳輸層(Transport):TCP-UDP協議層、Socket
- 高級層:會話層(Session)、表示層(Presentation)、應用層(Application)
Socket
- 簡單來說是IP地址與埠的結合協議(RFC793)
- 一種地址與埠的結合描述協議
- TCP/IP協議的相關API的總稱;是網路Api的集合實現
- 涵蓋了:Stream Socket/Datagram Socket
- 作用:
- 在網路傳輸中用於唯一標示兩個端點之間的鏈接
- 端點:包括(IP+Port)
- 4個要素:客戶端地址、客戶端埠、伺服器地址、伺服器埠
- TCP
- TCP是面向連接的通信協議
- 通過三次握手建立連接,通訊完成時要拆除連接
- 由於TCP是面向連接的所以只能用於端到端的通訊
- UDP
- UDP是面向無連接的通訊協議
- UDP數據包括目的埠號和源埠號信息
- 由於通訊不需要連接,所以可以實現廣播發送,並不局限於端到端
- TCP/IP協議中,兩個進程間通信的主要模式為:CS模型
- 主要目的:協同網路中的計算機資源、服務模式、進程間數據共享
- 常見的:FTP、SMTP、HTTP
Demo(略)
- 構建TCP客戶端、服務端
- 客戶端發送數據
- 伺服器讀取數據並列印
報文、協議、Mac地址
- 報文
- 報文段是指TCP/IP協議網路傳輸過程中,起著路由導航作用
- 用以查詢各個網路路由網段、IP地址、交換協議等IP數據包
- 報文段充當整個TCP/IP協議數據包的導航路由功能
- 報文在傳輸過程中會不斷地封裝成分組、包、幀來傳輸
- 封裝方式就是添加一些控制信息組成的首部,即報文頭
- 傳輸協議
- 協議顧名思義,一種規定,約束
- 約定大於配置,在網路傳輸中依然適用;網路的傳輸流程是健壯的穩定的,得益於基礎的協議構成
- 簡單來說:A->B的傳輸數據,B能識別,反之B->A的傳輸數據A也能識別,這就是協議
- Mac地址
- Media Access Control或者Medium Access Control
- 意譯為媒體訪問控制,或稱為物理地址、硬體地址
- 用來定義網路設備的位置
- 形如:44-45-53-54-00-00;與身份證類似
IP,埠,遠程伺服器
- 互聯網協議地址(英語:Internet Protocol Address,又譯為網際協議地址),縮寫為IP地址(英語:IPAddress)
- 是分配給網路上使用網際協議(英語:Internet Protocol,IP)的設備的數字標籤
- 常見的IP地址分為IPV4與IPv6兩大類
- IP地址由32位二進位數組成,常以http://XXX.XXX.XXX.XXX形式表現,每組XXX代表小於或等於255的10進位數
- 如:208.80.152.2
- 分為A、B、C、D、E五大類,其中E類屬於特殊保留地址
- IPV4
- 總數量:4,294,967,296個(即232):42億個;最終於2011年2月3日用盡
- 如果主機號是全1,那麼這個地址為直接廣播地址
- IP地址「255.255.255.255"為受限廣播地址
- IPV6
- 總共有128位長,IPV6地址的表達形式,一般採用32個十六進位數。也可以想像為1632個
- 由兩個邏輯部分組成:一個64位的網路前綴和一個64位的主機地址,主機地址通常根據物理地址自動生成,叫做EUI-64(或者64-位擴展唯一標識)
- 2001:0db8:85a3:0000:1319:8a2e:0370:7344
- IPv4轉換為IPv6一定可行,IPv6轉換為IPv4不一定可行
- 埠
- 如果把IP地址比作一間房子,埠就是出入這間房子的門或者窗戶
- 在不同門窗戶後有不同的人,房子中的用戶與外界交流的出口
- 外界鴿子(信息)飛到不同窗戶也就是給不同的人傳遞信息
- 0到1023號埠以及1024到49151號埠都是特殊埠
- 計算機之間依照互聯網傳輸層TCP/IP協議的協議通信,不同的協議都對應不同的埠
- 49152到65535號埠屬於「動態埠」範圍,沒有埠可以被正式地註冊佔用
- UDP
- 它一旦把應用程序發給網路層的數據發送出去,就不保留數據備份
- UDP在IP數據報的頭部僅僅加入了復用和數據校驗(欄位)
- 發送端生產數據,接收端從網路中抓取數據
- 結構簡單、無校驗、速度快、容易丟包、可廣播
- DNS、TFTP、SNMP
- 視頻、音頻、普通數據(無關緊要數據)
- 英語:User Datagram Protocol,縮寫為UDP
- 一種用戶數據報協議,又稱用戶數據報文協議
- 是一個簡單的面向數據報的傳輸層協議,正式規範為RFC 768
- 用戶數據協議、非連接協議
- 不可靠
- UDP包最大長度
- 16位->2位元組存儲長度信息
- 2^16-1=64K-1=65536-1=65535
- 自身協議佔用:32+32位=64位=8位元組
- 65535-8=65507 byte
UDP Api
- DatagramSocket
- 前面3個參數指定buf的使用區間
- 後面2個參數指定目標機器地址與埠(僅僅在發送時有效)
- 用於接收與發送UDP的類
- 負責發送某一個UDP包,或者接收UDP包
- 不同於TCP,UDP並沒有合併到Socket APl中
- 沒有伺服器端和客戶端
- DatagramSocket)創建簡單實例,不指定埠與IP
- DatagramSocket(int port)創建監聽固定埠的實例(接收數據的埠)
- DatagramSocket(int port,InetAddress localAddr)創建固定埠指定lP的實例(當計算機有多個IP地址存在時)
- receive(DatagramPacket d):接收
- send(DatagramPacket d):發送
- setSoTimeout(int timeout):設置超時,毫秒
- close() 關閉,釋放資源
- DatagramPacket(bytel] bufint offset,int length,InetAddress address,int port)
- SocketAddress相當於InetAddress+Port
- setData(bytel[] bufint ofset,int length)
- setData(bytel[l buf)
- setLength(int length)
- getData()、getOffset()、getLength()
- setAddress(InetAddress iaddr)、setPort(int iport) 發送時有效,接收時set操作是由系統完成的
- getAddress()、getPort()
- setSocketAddress(SocketAddress address)
- getSocketAddress()
UDP單播、廣播、多播
- 高頻次廣播有可能導致區域網或者某段網路的信息帶寬被佔滿
IP地址類別
- 廣播地址
- 255.255.255.255為受限廣播地址
- C網廣播地址一般為:XXX.XXX.XXX.255(192.168.1.255)
- D類IP地址為多播預留
- ipv4的地址本來就是用32位來表示的,分成4個8位來書寫, 所以ipv4和地址是可以和32位unsigned int
- 廣播地址運算
- IP:192.168.124.7
- 子網掩碼:255.255.255.0
- 網路地址:192.168.124.0
- 廣播地址:192.168.124.255
- 例子二
- IP:192.168.124.7
- 子網掩碼:255.255.255.192
- 網路地址:192.168.124.0
- 廣播地址:192.168.124.63
255.255.255.192->11111111.11111111.11111111.11000000
可劃分網段:2/2=4個
0~63、64~127、128~191、192~255
192.168.124.63
廣播通信問題
- 主機一:192.168.124.7,子網掩碼:255.255.255.192
- 主機二:192.168.124.100,子網掩碼:255.255.255.192
- 主機一廣播地址:192.168.124.63
- 主機二廣播地址:192.168.124.127
- 因為兩個主機的廣播地址不同,所以互相收不到對方的消息
區域網搜索Demo(略)
- UDP接收消息並回送功能實現
- UDP區域網廣播發送實現
- UDP區域網回送消息實現
TCP(Transmission Control Protocol)
- TCP是傳輸控制協議;是一種面向連接的、可靠的、基於位元組流的傳輸層通信協議,由IETF的RFC793定義
- 與UDP一樣完成第四層傳輸層所指定的功能與職責
- 三次握手、四次揮手
- 具有校驗機制、可靠、數據傳輸穩定
- 作用
- 聊天消息傳輸、推送
- 單人語音、視頻聊天等
- 幾乎UDP能做的都能做,但需要考慮複雜性、性能問題
- 限制:無法進行廣播,多播等操作
TDP Api
- socket():創建一個Socket
- bind):綁定一個Socket到一個本地地址和埠上
- connect():發起連接,連接到遠程套接字
- accept():接受一個新的連接,阻塞等待
- write():把數據寫入到Socket輸出流
- read():從Socket輸入流讀取數據
鏈接:http://www.imooc.com/article/267689
來源:慕課網本文首次發佈於慕課網 ,轉載請註明出處,謝謝合作推薦閱讀:
接手別人的代碼,死的心有嗎?
普通的程序員和大神級的程序員有什麼區別?
網上黑程序員的現實依據是什麼?程序員真的那麼悲慘嗎?
有哪些視頻堪稱有毒?
暴露真實IP真的沒關係嗎?
有哪些程序員特有的習慣?
月薪3萬的程序員都避開了哪些坑?
和程序猿談戀愛是一種怎樣的體驗?
推薦閱讀: