I/O多路複用技術

典型應用於如下場合
1.處理多個描述字時,好比同時處理套接字和磁盤IO、終端IO
2.一個客戶同時處理多個套接字
3.服務器既要處理監聽套接字,又要處理已鏈接套接字
4.既要處理TCP、也要處理UDP
5.一個服務器要處理多個服務和協議

 

I/O多路複用不侷限於網絡編程,也能夠用於其餘程序。

 

UNIX中五種I/O模型
1.阻塞I/O
2.非阻塞I/O
3.I/O多路複用
4.異步I/O
5.信號驅動I/O

 

信號驅動模型

 

5種I/O模型的比較
 

select函數有三種使用方式編程

1.函數阻塞直至有起碼一個描述符就緒
2.函數等待timeval指定的時間,在一個描述符準備好I/O時返回,最長等待時間不超過timeval指定的時間。
3.根本不等待,檢查描述字後當即返回
前兩種使用方式中,控制流將會等待,若是等待中的控制流接收到一個信號,控制流將被中斷並返回EINTR做爲返回值。針對該錯誤,須要再次重啓select

 

套接口準備好讀的條件
1.套接口接收緩衝區的字節大於等於套接口接收緩衝區低潮限度的當前值,對這個套接口的讀操做將不阻塞並返回一個大於0的值,咱們能夠經過SO_RCVLOWAT來設置這個低潮限度,對於TCP和UDP套接字,其值缺省爲1
2.鏈接的讀的這一邊關閉,即接收了FIN的TCP鏈接,對於這樣的套接字進行讀將不阻塞並返回0(即文件結束符)。
3.套接口是一個監聽套接字,且可用鏈接大於0的時候,對這樣的套接字讀取將不會阻塞。
4.有一個套接口錯誤待處理,對這樣的套接口進行讀取將不會阻塞,並返回-1,errno設置成明確的錯誤條件,這些待處理的錯誤也能夠經過SO_ERROR調用getsockopt得到並清除。

 

套接口準備好寫的條件
1.套接口可用發送緩衝區的字節數大於等於套接口發送緩衝區的低潮限度,且或者(1)套接口已鏈接,或者(2)套接口不要求鏈接(好比UDP),這意味着,若是咱們將這樣的套接口設爲非阻塞,寫操做將不阻塞並返回一個正值(由傳輸層接收的字節數),能夠經過SO_SNDLOWAT設置該低潮限度,對於TCP和UDP,其缺省值通常是2048.
2.套接口的發送這一邊關閉,對這樣的套接口進行寫入將產生SIGPIPE信號。
3.有一個套接口錯誤待處理,對這樣的套接字寫操做將不阻塞並返回一個錯誤-1,errno設置成明確的錯誤指示,對於這樣的錯誤也能夠經過SO_ERROR調用getsockopt得到並清除。

 

當一個套接口出錯時,其被select標記爲便可讀又可寫。
對於select來講,致使套接字可讀或者可寫的條件總結

 

 

shutdown的做用
正常終止網絡鏈接的方式是調用close,但close有兩個限制:引用計數,只有引用計數爲0才真正關閉;同時關閉write和read。
1.close將socket的引用計數減1,只有當引用計數爲0時才真正關閉,用shutdown能夠激發socket的正常關閉流程,即從FIN開始的4次交互,而無論訪問計數。
2.close終止了數據傳送的兩個方向。有不少時候咱們須要通知對端己方已完成數據發送,即便對端有不少數據待發送。
第2種場景的應用:read返回0看成通知,告訴對端己方已發完全部數據。
1.客戶端關閉shut_wr通知服務端,已完成全部客戶請求的發送。
2.服務器關閉shut_wr通知客戶端,全部應答已完成發送。

 

shutdown關閉寫一端的socket鏈接
 

shutdown和close的幾種應用場景和對比服務器

 

拒絕服務型攻擊
若是客戶端鏈接到服務器併發送了不完整的請求就中止,而服務器循環read,期待收到一個完整的請求,此時就會阻塞在單個客戶的請求,而不能給其餘客戶提供服務,這就叫作拒絕服務型攻擊。
解決拒絕服務型攻擊的方法就是不能讓服務器阻塞於某一個客戶端的請求。能夠解決的辦法有
1.非阻塞的I/O操做
2.每一個客戶的請求一個線程或者進程處理
3.設置超時,I/O設置超時時限

 

shut_down的SHUT_RDWR和close有什麼區別
shutdown的動做會當即終止讀和寫操做,在發送緩衝區的數據被髮往對端後,發出正常的TCP終止序列(FIN)
close的動做禁止在套接口上進行讀和寫操做,套接口發送緩衝區的內容被髮往另外一端,若是引用計數爲0,發出正常的TCP終止序列。
相關文章
相關標籤/搜索