1.客戶端-服務器結構linux
客戶端-服務器結構的物理部署分爲三類:windows
(1)在同一臺機器上:理想環境,只要壓力不大,分組不會丟失、延遲和亂序,是理想的測試環境,能夠用做評估客戶端和服務器端程序的原始性能;服務器
(2)在同一局域網內:接近理想環境,分組不多丟失、亂序,可是有延遲;網絡
(3)在廣域網內:分組丟失、重傳、重複、亂序比較常見。dom
2.基本套接字APIsocket
(1) sys/socket.h、winsock2.h:SOCKET socket(int domain, int type, int protocol)tcp
成功時返回套接字,失敗時返回-1(linux),INVALID_SOCKET(windows)函數
domain:通訊域,AF_INET爲互聯網,AF_LOCAL或AF_UNIX爲統一臺機器上進程間通訊;
type:套接字類型,性能
SOCK_STREAM爲可靠、全雙工、面向鏈接的字節流,對應於tcp;測試
SOCK_DGRAM爲不可靠、盡力而爲的數據報服務,對應於udp;
SOCK_RAW對ip層某些數據訪問;
protocol:對tcpip來講,這個字段一般由套接字類型隱含說明,參數默認被設置爲0。
(2) sys/socket.h、winsock2.h:int bind(SOCKET s, const struct sockaddr* local, int local_len)
成功時返回套接字,成功時返回0,失敗時返回-1(linux),SOCKET_ERROR(windows)
s:套接字描述符,由socket函數返回;
local:綁定的地址和端口,對AF_INET來講,對應的是struct sockadd_in;
local_len:peer結構體大小;
(3) sys/socket.h、winsock2.h:int listen(SOCKET s, int backlog)
成功時返回套接字,成功時返回0,失敗時返回-1(linux),SOCKET_ERROR(windows)
s:套接字描述符,由socket函數返回;
backlog:排隊等待應用程序接受的鏈接最大數量;
(4) sys/socket.h、winsock2.h:int accept(SOCKET s, struct sockaddr* peer, int* peer_len)
成功時返回套接字,成功時返回0,失敗時返回-1(linux),INVALID_SOCKET(windows)
s:套接字描述符,由socket函數返回;
peer:對等實體地址和其餘一些信息,對AF_INET來講,對應的是struct sockadd_in;
peer_len:peer結構體大小;
(5) sys/socket.h、winsock2.h:int connect(SOCKET s, const struct sockaddr* peer, int peer_len)
成功時返回套接字,成功時返回0,失敗時返回-1(linux),非0(windows)
s:套接字描述符,由socket函數返回;
peer:對等實體地址和其餘一些信息,對AF_INET來講,對應的是struct sockadd_in;
peer_len:peer結構體大小;
(6) sys/socket.h:int read(SOCKET s, void* buf, size_t len, int flags)
int write(SOCKET s, const void* buf, size_t len, int flags)
winsock2.h: int recv(SOCKET s, void* buf, size_t len, int flags)
int send(SOCKET s, const void* buf, size_t len, int flags)
成功時返回字節數,失敗時返回-1(linux),-1(windows)
s:套接字描述符,由socket函數返回;
buf:發送數據存儲;
len:發送字節數;
flags:與系統有關,linux和windows都支持MSG_OOB、MSG_PEEK、MSG_DONTROUTE
(7) sys/socket.h、winsock2.h:int recvfrom(SOCKET s, void* buf, size_t len, int flags,struct sockaddr* from, int from_len)
int sendto (SOCKET s, const void* buf, size_t len, int flags,struct sockaddr* to, int to_len)
成功時返回字節數,失敗時返回-1(linux),-1(windows)
s:套接字描述符,由socket函數返回;
buf:發送數據存儲;
len:發送字節數;
3.面向鏈接和無鏈接協議
面向鏈接和無鏈接指的是協議,不是物理介質。指的是協議的分組尋址是否獨立尋址,協議是否須要維護分組之間的狀態。這裏的分組是協議分組,不是指應用程序要傳輸的數據大小。
UDP經過只向IP層增長兩項功能:增長可選的校驗和來檢測數據的損壞狀況;添加端口區分上層應用;
TCP經過向IP層增長三項功能實現了可靠性:增長可選的校驗和來抵抗數據損壞;爲每字節增長序列號抵抗亂序;增長確認——重傳機制抵抗丟失。
4.子網與CIDR
傳統上將ip地址分爲5類,稱爲分類編址:
A類:7bit網絡24bit主機 0.0.0.1——127.255.255.255
B類:14bit網絡16bit主機 128.0.0.1——191.255.255.255
C類:21bit網絡8bit主機 192.0.0.1——223.255.255.255
D類:多播1110開頭
E類:保留4bit1開頭
爲了使用較小路由表,使單個網絡ID的Ip地址空間獲得有效利用,並且享有每一個網段具備獨立網絡ID時路由的便捷性,咱們須要從外部主機看是單個網絡,從內部主機看是多個網絡。實現這種功能的機制就是子網劃分。
5. tcp是一種流協議
對tcp應用程序來講,沒有分組的概念,應用程序須要本身肯定包的大小和邊界。有三種方式肯定包大小:
固定包大小,全部分組的包大小相同;
使用記錄結束標誌,這須要在發送端對報文主題中的結束標誌進行轉義,接收端掃描整個報文;
使用報文頭來指定報文大小,這種方式必須當心編譯器自己對數據封裝的填充、42. 1。
6. UDP的使用注意實現
對於簡單的請求、應答程序來講,UDP的性能會顯著優於TCP。所以能夠考慮使用UDP協議做爲基於事務的應用程序的支撐協議。
健壯的UDP程序必須提供:合理時間內沒有收到應答則重傳;應答和請求的正確匹配;流量控制;擁塞控制。這裏合理的時間要靠RTO定時器來計時,可是大小就是須要根據網絡條件來調整了。應答和請求的正確匹配可使用序列號的方式來保證。TCP的滑動窗口是實現流量控制的常見方式。·
應該避免爲了使用UDP而在用戶層實現TCP的可靠性,這可能不會致使性能比TCP好,並且也可能會出錯。若是既想擁有TCP的可靠性,又想使用UDP差很少的事務性能,可使用T/TCP。
7.TCP的可靠性
TCP是一個端到端協議,保證的是對等實體間的可靠性,也就是tcp層到tcp層間的可靠性。只要兩個對等的tcp之間是鏈接的,tcp就能保證將數據可靠(按序、無損)的傳送。這裏的受損是指在因特網校驗和的條件下未受損。對等應用程序間的可靠性須要應用程序本身來保證。即,從應用程序A經過tcp發送到應用程序B,凡是A的tcp層收到ACK的都表示已經可靠的傳輸到B的tcp層;凡是B的應用程序收到的數據都是按序且未受損的。
鏈接中斷的三種狀況:
(1) 永久或臨時的網絡中斷:;
(2) 對等的應用程序崩潰:;
(3) 對等的應用程序所在主機崩潰:;
8.