unix網路程式設計(筆記一)

2021-06-13 19:19:57 字數 4276 閱讀 1656

一。

1.乙個長時間執行的程式,即守護程序,它只在響應來自網路的請求時才傳送網路訊息。

2.通常乙個客和每次只與乙個伺服器通訊,不過以web瀏覽器為例子,該客戶端程式卻可以與多個不同的web伺服器通訊。

3.tcp/ip 協議簇 ,也稱為「網際協議簇「

4.英特網 和 網際網

*網際網路是乙個網際網

*網際網是採用tcp/ip協議通訊所連通的網路。

*網際網路只有乙個,全球具有位址唯一性。不屬於網際網路的網際是可以是任何乙個節點分配位址。

*乙個程序關閉會關閉它所開啟的所有描述符(檔案、socket、pipe等),即將結束的程式,也可以不close(fd)的。不過通常我們都close()

5.bzero 比 memset 更好記憶。 因為memset引數如果搞亂了,memset都檢查不出來,因為都是int型別。bzero(&add, sizeof(add) );

6.inet_pton() 支援ipv6的ip位址轉換器。 inet_add()舊的。

7.之所以ip要使用通用的struct sockaddr* ,是因為套接字函式早於ansic標準,void*還不可用,否則我們可以用void*表示任何資料結構。

8.tcp是乙個沒有字元邊界的位元組流,源源不斷,udp則有其資料邊界結尾。

9.tcp傳輸層的資料單元叫分節,如果分節大於傳送緩衝區,則分段進行傳送。

1.read()不能確保一次效能讀完all the data,所以我們應確保它能在迴圈中一直讀取資料直到read返回0或負值才結束對資料的接收讀取。

對於客戶端:伺服器close(fd)表示資料結束

對於服務端:客戶端close(fd)表示資料傳送完畢或請求結束。

errno值不應該用於多執行緒的全域性變數來記錄。因為是多執行緒的。嘻嘻

2.unix在乙個程序終止時總是關閉該程序所有開啟的描述符。

3.傳輸層:分節 , 網路層:ip資料報,鏈路層:禎,物理層:bit傳輸咯。  除了物理層,這些單元是越來越大呀。

4.tcp/ip協議族,為提高效率,應盡可能避免ip的分層與重組操作。

5.ipv4資料報最大65535,ipv6最大65575

避免被另乙個函式集細節把網路程式設計討論搞負雜了。

6.錯誤處理:包裹函式。 它很少是程式效能的瓶頸所在。

7.每個包裹函式完成實際的函式呼叫,檢查返回值,並在發生錯誤時終止程序。大寫開頭的函式。

8.執行緒函式出錯時並不把錯誤返回給主調,而是通過設定errno值返回。

9.inaddr_any表示多個網路介面和主機程序可以在任意網路介面上接受客戶鏈結

1.snprintf() 比 sprintf()要好,因為sprintf()不檢查緩衝區溢位。fgets, strncat ,strncpy,strlcat, strlcpy

2.size_t類似的資料型別的定義,其實是為了更好的融合32,64位機,為了可移植性嘛

二。*傳輸層tcp ,udp,sctp ,udp是乙個無連線的協議哦。

1.udp:每個資料都有乙個長度,該長度隨資料一起傳送到目標端。因為他是無連線的。

udp每傳送乙個資料報都會建立鏈結,傳送,釋放鏈結。如果udp呼叫connect的話呢,那麼核心就記住第一次對端的ip/port,這樣之後就不需要總是建立和釋放鏈結,直接傳送資料即可。

2.tcp . 1  對 多 , udp. 多 對 多

3.tcp如果沒有收到確認,就自動重傳並延長等待時間。

4.流量控制--》通告視窗:接收緩衝的容量

5.ipv4 32位,ipv6 128位

6.3次握手:

1.客發syn j

2.服回ack , syn j+1

3.客回ack j+1+1

7.tcp選項:

1.最大分節大小:tcp_maxseg

2.最大視窗大小:so_rcvbof

四次終止:

close() ------> fin,j

<-----ack j+1

<------fin,n

------->ack n+1; (time_waite為了處理該ack丟失的情況)

主動發起close的在這裡進入time_wait狀態,因為他要確保對面的掛,他要保證萬一這個ack在途中阻塞等一系列情況,讓ack到達對方,避免過期。然後他自己會過一段時間掛掉。

8.tcp狀態轉換:

close-------------------------listen

syn_send--------------------syn_rcvd

established----------------established

fin_waite_1------------------------close_waite

fin_waite_2-------------------------last_ack

time_waite--------------------------closed

closed

9.       2msl最大分節生命期的2倍時長,msl在網際網路中存活最長的ip資料報。

三。1.埠號:

*埠號可以區分程序使用的多種不同的協議tcp,udp

* 0--1023 屬於程序埠

* 1024---49151已登記埠號:用來給服務端程式使用

* 49152--65535動態埠號:給客戶程式的臨時埠號

2.標識每個端點的兩個值(ip,埠對)通常稱為乙個套接字。 4元素才能確定訊息目標與起始。

3.tcp必須為已傳送的資料保留乙個副本。直到他被對端確認為止。。。。然後才丟棄。

4.udp是不可靠的,因此無需緩衝區。

5.write成功僅僅表示:資料已成功加入到鏈路層的輸出佇列,並不代表對方接收成功。

6.主動執行關閉的那一端,是歷經time_wait狀態的那一端。 -------- 為了處理最終的哪乙個ack丟失的情況。

四。基本套接字程式設計

1.tcp,udp的ip與port在套接字位址結構中總是以網路位元組序來儲存的。

4.核心 到 程序  :accept recvfrom getsockname getpeername

5.位元組排序:小端 大端 ----》網路位元組序列。主機位元組序列。

6.在大端系統中,這些位元組排序函式通常被定義為空巨集。 htons htonl ntohs ntohl()

7.客戶端不用bind(),核心則會確定源位址,且會選擇乙個臨時埠。

8.調getsockname()可得到臨時埠資訊。

1.accept()第

二、三個引數為空指標表示我們對客戶不關心。 (0---1023埠的bind必須以root身份bind)

2.close(fd) 僅僅是引用計數減1罷了。直到0才真正釋放。

3.getsockname()本地資訊,getpeername()外地資訊 (ip,port)

4.乙個訊號處理函式執行期間,正被遞交的訊號是阻塞的。

5.如果乙個訊號在被阻塞期間產生了一次或多次,那麼該訊號被解阻塞後,通常只遞交一次:訊號預設是不排隊的。

6.unix關機時,init程序會給所有程序傳送sigterm訊號以關閉,過一段時間再發sigkill訊號;sigkill訊號是無法**獲的。

7.以文字串方式傳遞資料會比較好,因為客----服 就解釋二進位制序列不一致。因為小端大端不同的問題導致。

8.i/o復用,處理多個描述符select() poll(),不因為乙個描述符而阻塞其他描述符的資料交流。

9.輸入操作:1.等待資料準備好 2.從核心向程序複製資料。程序----》核心複製

*阻塞i/o

*非阻塞i/o

*i/o復用

訊號驅動式i/o模型----由訊號來處理

非同步i/o模型------------告之核心處理,處理完了讓它通知過來/。

五。*套接字選項

1.fcntl()設定非阻塞 或 訊號驅動式i/o,設定屬性

2.getsockopt() setsockopt()

3.tcp已連線套接字會從監聽套接字繼承過來。

4.fcntl:235page or 183page . 

常用的選項:so_keepalive so_rcvbuf so_sndbuf so_reuseaddr

六。udp套接字程式設計 187

sendto() recvfrom()

一般來說,大多數tcp伺服器是併發的,udp是迭代的。

2.udp的connect()能夠提高效率,避免每個包都建立鏈結和釋放鏈結。

七。gethostbyname() gethostbyaddr(0 getserverbyname() getserverbyport() getaddrinfo() getnameinfo()

unix網路程式設計 鎖(一)

閱讀了unix網路程式設計的卷二之後,看著裡面的例項並且理解其原理演算法,就將裡面的c語言的鎖api進行c 封裝以供以後使用。實現的鎖介面以及一些演算法會封裝到我的timepass庫中。我覺得應該就鎖的問題寫乙個系列的部落格。鎖按照其作用域可以分為執行緒鎖和程序鎖 按照其工作方式 又可以分為互斥鎖,...

UNIX網路程式設計

在unix network programming 的 3.7 inet pton and inet ntop functions 中提到中有如下兩個巨集定義 define inet addrstrlen 16 for ipv4 dotted decimal define inet6 addrstr...

unix網路程式設計

任何tcp的實現都需要為msl選擇乙個合適的值,rfc的建議值是2分鐘。分組可能出現迷途,若迷途分組在msl中找到路,造成重複,tcp必須修復 time wait存在的理由 可靠的實現全雙工的連線和終止 考慮最終ack丟失的情況,允許老的重複分組在網路中消逝 tcp的化生身現象,因為time wai...