正在學習計算機網絡課程,以下是學習《計算機網絡-自頂向下方法》的一些筆記,部分圖片來自mooc網 哈爾濱工業大學 計算機網絡課程:https://www.icourse163.org/course/HIT-154005。
1. P2P應用
1.1 純P2P架構
- 沒有服務器
- 任意端系統間直接通信
- 節點階段性接入Internet
- 節點可能更換 IP 地址
以下以具體應用講解P2P架構
1.2文件分發
- 在C/S架構中,服務器穿行地發送N個副本,所需時間爲 NF/ Us;客戶機 i 需要 F / di 時間下載;最終所耗時間取上述兩者的最大值;當N很大時,時間幾乎隨N線性增長
- 在P2P架構中,服務器至少發送一個副本,時間 F/Us;客戶機 i 需要 F / di 時間下載;所有客戶機總共需要下載 NF 個比特;最快上傳速率可能是 Us+ U1+…+Un;
- P2P所需時間:
- C/S vs P2P 的最小分發時間
因此,具有P2P 體系結構的應用程序能夠是自擴展的。 這種擴展性的直接成因是:對等方除了是比特的消費者外還是它們的重新分發者。 - BitTorrent 是一種用於文件分發的流行 P2P 協議
- 參與一個特定文件分發的所有對等方的集合被稱爲一個洪流( torrent) 。 在一個洪流中的對等方彼此下載等長度的文件塊 (chunk) ,典型的塊長度爲 256KB
- 當一個對等方首次加入一個洪流時,它沒有塊。 隨着時間的流逝,它累積了越來越多的塊。 當它下載塊時,也爲其他對等方上載了多個塊。
- 一且某對等方獲得了整個文件,它也許(自私地)離開洪流,或(大公無私地)留在該洪流中並繼續向其他對等方上載塊。
- 同時,任何對等方可能在任何時候僅具有塊的子集就離開該洪流,並在以後重新加人該洪流中。
- 每個洪流具有一個基礎設施結點,稱爲追蹤器( tracker) 。 當一個對等方加入某洪流時,它向追蹤器註冊自己以獲得節點清單,與某些節點建立連接,並週期性地通知追蹤器它仍在該洪流中。
2.Socket編程
2.1應用編程接口API
應用進程的控制權和操作系統的控制權進行轉換的一個系統調用接口
典型的應用編程接口:
- Berkeley UNIX操作系統定義了一種API,稱爲套接字接口(socket interface),簡稱套接字(socket)
- 微軟公司在其操作系統中採用了套接字接口API,形成了一個稍有不同的API,稱爲Windows Socket Interface,簡稱WINSOCK
2.2Socket API
- 最初設計:
- 面向 BSD (Berkeley Software Distribution,伯克利軟件套件,是Unix的衍生系統,在1977至1995年間由加州大學伯克利分校開發和發佈)
- 面向TCP/IP 協議棧接口
- 目前:
- 事實上的工業標準
- 絕大多數操作系統都支持
- 通信模型:C/S
- 標識通信端點?(對外):IP地址+端口號
- 操作系統/進程如何管理套接字?(對內):套接字描述符 socket descriptor
- 當應用進程創建套接字時,操作系統分配一個數據結構存儲該套接字的相關信息,返回套接字描述符
2.3Socket API函數(WinSock)
- WSAStartup
- 必須首先調用該函數
- WSACleanup
- 完成對Socket庫的使用後,調用該函數,解除與socket庫的綁定,釋放Socket庫所佔用的系統資源
- socket
- 用於創建套接字,操作系統返回套接字描述符
- 第一個參數:協議族,如 PE_INET (TCP/IP)
- 第二個參數:套接字類型,有SOCK_STREAM(面向TCP)、SOCK_DGRAM(面向UDP)、SOCK_RAW(面向網絡層) (TCP/IP)
- 第三個參數:協議號,默認爲0
- Closesocket
- 關閉一個套接字
- 多個進程共享一個套接字時,要調用該函數使套接字引用計數減一,減至0才關閉
- 一個進程中的多線程對一個套接字的使用無計數。若某線程調用該函數將套接字關閉,則該進程中的其他線程也不能訪問該套接字
- bind
- 綁定套接字的本地端點地址(IP地址+端口號)
- 第一個參數:套接字描述符
- 第二個參數:端點地址(localaddr)
- 結構:sockaddr_in
- 客戶程序一般不用調用bind函數
- 服務器可採用地址通配符:INADDR_ANY
- listen
- 置服務器端的流套接字處於監聽狀態
- 僅服務器端調用,僅用於面向連接的流套接字
- 第一個參數:套接字描述符
- 第二個參數:設置連接請求隊列大小(queuesize)
- connect
- 客戶端調用該函數使客戶端套接字與特定計算機的特定端口的套接字連接
- 僅用於客戶端(可用於TCP客戶端,也可用於UDP客戶端)
- accept
- 服務程序調用該函數從處於監聽狀態的流套接字的客戶連接請求隊列中取出一個排在最前面的一個客戶請求,並創建一個新的套接字與客戶端套接字創建連接通道
- 僅用於TCP套接字
- 僅用於服務器
- recv
- 接受數據
- 用於TCP套接字或 連接模式的客戶端UDP套接字
- recvfrom
- 接受數據報
- 用於非連接模式的UDP套接字
- send
- 發送數據
- 用於TCP套接字或 連接模式的客戶端UDP套接字
- sendto
- 發送數據報
- 用於非連接模式的UDP套接字
- setsockopt
- 設置套接字選項參數
- getsockopt
- 獲取套接字參數選項
- Socket API(TCP)調用基本流程