一。int socket(int domain, int type, int protocol)
1.domain -- 指定使用何種的地址類型
PF_INET, AF_INET: Ipv4網絡協議
PF_INET6, AF_INET6: Ipv6網絡協議
AF = Address Family
PF = Protocol Family
2.type -- 設置通信的協議類型
SOCK_STREAM: 提供面向連接的穩定數據傳輸,即TCP協議。
OOB: 在所有數據傳送前必須使用connect()來建立連接狀態。
SOCK_DGRAM: 使用不連續不可靠的數據包連接。
SOCK_SEQPACKET: 提供連續可靠的數據包連接。
SOCK_RAW: 提供原始網絡協議存取。
SOCK_RDM: 提供可靠的數據包連接。
SOCK_PACKET: 與網絡驅動程序直接通信。
3.protocol -- 指定socket所使用的傳輸協議編號
這一參數通常不具體設置,一般設置為0即可
二。socket.setsockopt(level, optname, value)
在套接字級別上(SOL_SOCKET),option_name可以有以下取值:
SO_DEBUG,打開或關閉調試信息。
SO_REUSEADDR,打開或關閉地址復用功能。
SO_DONTROUTE,打開或關閉路由查找功能。
SO_BROADCAST,允許或禁止發送廣播數據。
SO_SNDBUF,設置發送緩沖區的大小。其上限為256 * (sizeof(struct sk_buff) + 256),下限為2048字節。
SO_RCVBUF,設置接收緩沖區的大小。上下限分別是:256 * (sizeof(struct sk_buff) + 256)和256字節。
SO_KEEPALIVE,套接字保活。
SO_OOBINLINE,緊急數據放入普通數據流。
SO_NO_CHECK,打開或關閉校驗和。
SO_PRIORITY,設置在套接字發送的所有包的協議定義優先權。
SO_LINGER,如果選擇此選項, close或 shutdown將等到所有套接字里排隊的消息成功發送或到達延遲時間后才會返回. 否則, 調用將立即返回。
SO_PASSCRED,允許或禁止SCM_CREDENTIALS 控制消息的接收。
SO_TIMESTAMP,打開或關閉數據報中的時間戳接收。
SO_RCVLOWAT,設置接收數據前的緩沖區內的最小字節數。
SO_RCVTIMEO,設置接收超時時間。
SO_SNDTIMEO,設置發送超時時間。
SO_BINDTODEVICE,將套接字綁定到一個特定的設備上。
SO_ATTACH_FILTER和SO_DETACH_FILTER。
三。TCP可靠,UDP不可靠的原因--SO_RCVBUF 、SO_SNDBUF
每個TCP socket在內核中都有一個發送緩沖區和一個接收緩沖區,TCP的全雙工的工作模式以及TCP的滑動窗口便是依賴於這兩個獨立的buffer以及此
buffer的填充狀態。接收緩沖區把數據緩存入內核,應用進程一直沒有調用read進行讀取的話,此數據會一直緩存在相應socket的接收緩沖區內。
再啰嗦一點,不管進程是否讀取socket,對端發來的數據都會經由內核接收並且緩存到socket的內核接收緩沖區之中。read所做的工作,就是把內核緩
沖區中的數據拷貝到應用層用戶的buffer里面,僅此而已。
進程調用send發送的數據的時候,將數據拷貝進入socket的內核發送緩沖區之中,然后send便會在上層返回。換句話說,send返回之時,數據不一定
會發送到對端去,send僅僅是把應用層buffer的數據拷貝進socket的內核發送buffer中。
每個UDP socket都有一個接收緩沖區,沒有發送緩沖區,從概念上來說就是只要有數據就發,不管對方是否可以正確接收
對於TCP,如果應用進程一直沒有讀取,buffer滿了之后,發生的動作是:通知對端TCP協議中的窗口關閉。這個便是滑動窗口的實現。保證TCP套接口
接收緩沖區不會溢出,從而保證了TCP是可靠傳輸。因為對方不允許發出超過所通告窗口大小的數據。 這就是TCP的流量控制,如果對方無視窗口大小
而發出了超過窗口大小的數據,則接收方TCP將丟棄它。 對於UDP,當套接口接收緩沖區滿時,新來的數據報無法進入接收緩沖區,此數據報就被丟棄。