PDU
協議數據單元,有隱藏size上限,若是應用程序的包超過指定上限會被劃分爲多個PDU發送
TCP不提供記錄結束標記,須要應用程序本身提供,好比http的\r\n
編寫TCP協議須要注意IPV4和IPV6的兼容性,能夠在應用程序中實現協議無關性。
多線程的socket編程不能依賴於標準的errno變量,在多線程中,error經過返回值而不是errno的方式通知調用者。
出於網絡安全的考慮,應當使用strncpy、strncat、snprintf替代無緩衝區檢查的字符串函數,避免黑客的字符串溢出攻擊。
sockaddr和sockaddr_in在傳給函數作參數的時候必須強轉指針類型,是由於早期的套接字接口產生時尚未void*指針。
對廣播地址執行ping命令,能夠獲取子網中全部ip信息
繞過TCP和UDP,直接使用IPV4和IPV6,被稱爲原始套接口編程
ping使用ICMP協議,ICMP是TCP的補充協議,也是一種傳輸層協議。
tcpdump使用DLPI(數據鏈路層接口)或者BPF(BSD分組過濾器,提供訪問數據鏈路層接口)協議,使用數據鏈路層協議。
一個udp套接字是由一個二元組來標識的,具有不一樣的源IP和源端口,但具備相同的目的IP和目的端口號的數據包將經過相同的套接字被定向到同一個目的進程。
一個tcp套接字是由一個四元組標識的,具有不一樣的源IP和源端口,但具備相同的目的IP和目的端口號的數據包將被定位到不一樣的套接字。
udp是一種無鏈接的協議,由於udp的客戶端和服務器無需維持長久的關係,一個客戶端可使用一個套接字向不一樣的服務器發送消息,一個服務端也可使用同一個套接字接收來自不一樣客戶端的消息。
TCP估算客戶端到服務器往返花費時間RTT的算法是動態的,由於隨着負載的不一樣,往返花費時間是動態變化的。
關閉鏈接的FIN消息除了關閉單向鏈接還具備結束文件的做用,收到FIN的端會把FIN做爲文件結束符傳遞給接收應用進程(放在已排隊等待接收的任何數據以後)。表示應用程序在鏈接上再也接收不到額外數據,但TCP仍是能夠接收消息的,想一想後面的ACK消息是怎麼接收的。
TCP是沒有消息邊界的,UDP具備長度,能夠認爲每一個UDP數據報都是一條消息。
大多數狀況下是客戶端主動關閉鏈接,而HTTP協議是服務端主動關閉鏈接。
TCP鏈接有11種狀態,使用netstat能夠顯示全部這些狀態。
TIME_WAIT狀態的時間是MSL(最常分節生命期)的兩倍,有時稱爲2MSL,MSL是IP數據報在互聯網中能生存的最長時間。RFC1122建議MSL是2分鐘,而berkeley的實現傳統上是30s。
存在TIME_WAIT狀態的理由:
1。實現終止TCP全雙工鏈接的可靠性,(假設主動關閉的一端是客戶端,被動關閉的一端是服務端)假設最終的ACK丟失,服務端將重發最終的FIN,必須維持狀態以便重發最終的ACK。若是不維護狀態,客戶端將響應以RST分節,這個分節被認爲是某種錯誤。TIME_WAIT存在的目的是爲了解決關閉鏈接的任何一個分節可能丟失的情況。
2.容許老的重複分節在網絡中消逝,假設一個鏈接在關閉後又以相同的IP和端口號創建新的鏈接,必需要保證老的鏈接的重複分組在網絡中已經消失,避免被認爲是新的鏈接的分組。爲了作到這點,TCP不能給出於TIME_WAIT階段的鏈接創建新的化身鏈接(指以同樣的IP和端口創建鏈接)。
UNIX系統有保留端口的概念,任何小於1024的端口都只能分配給超級用戶進程的套接口。即周知端口的啓動必須有超級用戶權限。
TCP有一個MSS,通告對方在每一個分節中能夠發送的最大TCP字節量,避免在通過路由的時候被分片。
TCP的發送是異步的,write返回僅僅表示數據拷貝到了發送緩衝區,並不表明對端收到了消息。
字節流套接字上的read和write的表現不一樣於一般的文件I/O,字節流套接字上read和write實際讀取和寫入的字節可能比要求的少,這多是套接字的緩衝區達到了極限,而不是錯誤,此時須要作的是再次調用read和write。
RST表示指定的對端的端口沒有進程在等待鏈接。
connect失敗時,套接字再也不可用,該套接字必須被關閉,不能再次connect該套接字,再次鏈接須要關閉該套接字,從新調用socket。
connect函數調用前不必定非得調用bind,若是有必要,內核將分配一個臨時端口,server通常會調用bind,由於要綁定一個周知端口供客戶端鏈接。
當有客戶端發送SYN時,服務器首先在未完成鏈接隊列創建條目,若是三次握手完成,把該條目從未完成隊列轉移到已完成隊列的隊尾。當調用accept的時候,從已完成隊列的隊首返回一個鏈接(三次握手在accept以前已經完成,accept是從已創建鏈接的隊列中取出隊首)。
listen函數只作兩件事
1.使用socket建立一個套接字時,內核默認是主動套接字,將調用connect發起鏈接的客戶端套接字,而listen將未鏈接的套接字轉換爲被動套接字,等待其餘socket的鏈接請求。同時TCP的狀態CLOSED狀態轉換到LISTEN。
2.設置內核爲此套接口排隊的最大鏈接數。
TCP套接字的close接口給socket打上已關閉的標記,應用進程不能在此套接字上read和write,TCP會嘗試發送已排隊的全部數據,而後按照正常的序列關閉TCP鏈接。
獲取與套接口關聯的本地協議地址getsockname,getsockname也能夠對未綁定的套接字使用,獲取與套接口關聯的遠程協議地址getpeername,知道客戶協議地址的另外一個方法是accept。