一。
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...