UNIX網路程式設計卷1:套接字聯網API 詳解筆記
UNIX網路程式設計卷1:套接字聯網API 詳解筆記
第一部分:簡介和TCP/IP
1.Socket 套接字
sockfd = socket(AF_INET(網際流), SOCK_STREAM, 0);
2.*bind(int fd, const struct sockaddr sa, socklen_t salen)
套接字繫結函式
3.監聽套接字
socket、bind、listen三個函式依次執行,是TCP伺服器準備監聽描述符的標準步驟。
sockfd = socket(AF_INET, SOCK_STREAM, 0);
bind(sockfd, (SA* )servaddr, sizeof(servaddr));
listen(sockfd, LISTENQ)
4.接受客戶連線,傳送應答
connfd = accept(sockfd, (SA*)NULL, NULL);
accept是程序進入睡眠,TCP握手協議完成之後,accpet接收到應答,返回值稱為已連線描述符,
用於與已經連線上的客戶端進行通訊。
5.OSI模型
應用層
表示層 應用層
會話層
傳輸層 TCP UDP
網路層 IPv4、IPv6
資料鏈路層 裝置驅動程式和硬體
物理層
6.UDP 是簡單不可靠的傳輸協議。
7.TCP是複雜而又可靠的傳輸協議。
8.STCP是可靠的傳輸協議,同時還提供訊息邊界、傳輸級別多宿支援以及將頭端阻塞減小到最少的一種方法。
協議:
IPv4 32位地址,給TCP、UDP、STCP、ICMP、IGMP提供分組遞送服務
IPv6 128位地址,給TCP、UCP、STCP、ICMPv6 提供分組遞送服務
TCP 傳輸控制協議 給使用者提供全雙工位元組流,TCP套接字是一種流套接字,可用IPv4或IPv6實現
UDP 使用者資料報協議 UDP套接字是一種資料包套接字,不保證資料準確到達,可用IPv4或IPv6實現
SCTP 流控制傳輸協議 提供可靠的全雙工關聯的面向連線的協議,STCP是多宿的,每個關聯的兩端涉及一組IP地址和埠號。
ICMP 網際訊息控制協議 主要處理路由器與主機之間的錯誤和控制訊息。ping 和 traceroute使用這個協議
IGMP 網際組管理協議 IGMP用於多播
ARP 把一個IPv4地址轉換成一個硬體地址
RARP 把一個硬體地址轉成IPv4地址
ICMPv6 集成了ICMPv4 ARP 以及 IGMP的功能
BPF BSD分組過濾器 用於提供對資料鏈路的訪問能力
DLPI 資料鏈路提供者介面 用於提供對資料鏈路的訪問能力
9.TCP和UDP的特性:
UDP
UDP缺乏可靠性,需要對應用程式新增不同的功能,對端的確認、本端的超時與重傳等;UDP提供無連線的服務,表示一個客戶端可以向多個服務端傳送同一包資料。
TCP
TCP可靠性:1.TCP建立伺服器與客戶端之間的連線;2.TCP有訊息應答機制;3.TCP擁有一個計算客戶端與伺服器之間傳輸一次需要的時間;3.TCP會對多次分包傳輸的資料加上序列號,重新排序;4.TCP 提供流量控制,保證客戶端傳給伺服器的資料永遠不會超過伺服器剩餘的空間;TCP是全雙工協議。
流控制傳輸協議(SCTP)
STCP與TCP、UDP類似。與TCP不同的是STCP是面向訊息的協議,與UDP一樣,將傳送端寫入的每條記錄的長度隨資料一道傳遞給接收端應用。STCP可以在連線的端點之間提供多個流,並且相互不會影響。STCP支援多宿性,保持可以支援多個IP地址。
10.TCP選項
MSS選項:最大分節大小
視窗規模選項:最大視窗規模可以達到1GB
時間戳選項:防止由失而復現造成的資料損壞
11.伺服器傳送資料耗時長時,則先是傳送確認,後是應答。
12.MSL是任何IP資料報能夠在英特網中存活的最長時間。最長分節時間。傳統是30秒。
13.TIME_WAIT狀態 持續時間大約是MSL的兩倍
1.可靠的實現TCP全雙工連線的終止
2.允許老的分解在網路中消逝(防止老的重複分組被認為是新的分組的化身)
14.SCTP的連線建立與終止
四路握手
(1)伺服器被動開啟,通過呼叫socket、bind、listen。
(2)客戶通過呼叫connect或者傳送一個隱式開啟該關聯的訊息進行主動開啟。
(3)伺服器回覆一個INIT ACK
(4)客戶端傳送一個COOKIE ECHO回給伺服器
(5)伺服器回覆一個ACK證明發送的是正確的cookie
15.SCTP的分組單位資訊為塊
SCTP選項:
1.動態地址擴充套件,允許協作的SCTP端點從已有的某個關聯中動態增刪IP地址;
2.不完全可靠性擴充套件,允許協作的SCTP端點在應用程序的指導下進行資料限制,去掉過於陳舊的訊息。
16.埠號
TCP/IP協議分配給FTP伺服器的埠號是21
UDP分配給TFTP(簡化郵件傳送協議)的埠號是69
17.眾所周知的埠號為0~1023,由IANA分配和控制,可以將一個埠號同時分配給TCP、UDP、SCTP同一給定的服務。
18.已登記的埠號為102449151,不受IANA控制,但是會登記到IANA的埠使用表中,相同的埠也可分配給TCP、UDP給定的服務。如60006063分配給這兩種協議的X Window伺服器。
49152~65535是動態的或私用的埠,是臨時埠,不受IANA管轄。
19.套接字對
TCP套接字對是一個定義連線的兩個端點的四元組:本地IP地址、本地的TCP埠號、外地IP地址、外地TCP埠號。套接字對唯一標識一個網路上的每個TCP連線,但是對於一個端點多宿的情況下,一個端點就需要多個四元組標識。
標識每個端點的兩個值(IP地址和埠號)通常稱為一個套接字。
IPv4資料包最大為65535位元組,包括IPv4首部。
IPv6資料包最大為65575位元組,包括IPv6首部,40位。
MTU 最大傳輸單元,IPv4規定的最小鏈路MTU為68位元組,IPv6規定的最小鏈路的MTU為1280位元組。
IP資料報超出相應鏈路的MTU時,IPv4和IPv6都將進行分片,這些片段在最終到達目的地之前不會進行重組。IPv4主機和路由器(轉發)都會對自身發出的資料報進行分片;而IPv6只有主機會對發出的資料報進行分片,而路由器不會對其轉發的資料報進行分片。
IPv4首部的DF位專門用於設定分片,IPv6每個資料報都隱含一個數據位,所以IPv6傳輸資料報是要麼用最小的傳,要麼必須支援。
IPv4和IPv6都有最小緩衝區重組大小,IPv4為256位元組,IPv6為1500位元組。
TCP有個MSS(最大分節大小),通知對方重組緩衝區大小的實際值,避免分片;MSS通常設定為MTU減IP和TCP首部的固定長度。乙太網中IPv4為1460,IPv6為1440(TCP首部20位元組,IPv4首部20位元組,IPv6首部40位元組)。TCP的MSS選項中,MSS是一個16為的欄位,IPv4最大值為65495,IPv6的最大值為65515。
SCTP基於對端所有地址發現的最小路徑MTU保持一個分片點。
後續還會更新。