一:網絡分層
爲什麼要對網絡進行分層?
雙方通信時共同遵循規範,由於這個過程非常複雜,所以對各個部分進行分層. 各分層有對應的協議,各司其職. 本層的改變不影響全局的改變.每一個層次只需利用提供的接口向上輸出.
網絡層: IPV4 , IPV6
傳輸層: TCP/UDP 傳輸控制, 提供16爲的端口號.
二: 傳輸層
1)端口號
縱所周知,服務器端的端口號往往是被動打開,也被稱爲監聽端,服務器端.
端口號(0-1023) 任何其他進程不能使用,永久分配給某應用程序使用. 是有INAN分配.
從1024-41951 叫註冊端口. 非常流行的服務會佔用某個服務端口.如mysql 默認佔用的是3306端口.
從41952- 臨時使用動態端口,或者私有端口.這個端口範圍是可以通過調節內核參數 來實現.
cat /proc/sys/net/ipv4/ip_local_port_range: 32768 61000 此處有兩個端口,表示可以作爲臨時端口的起始數字和結束數字.對於遇到大量的需要佔用臨時接口的應用程序需要調整此接口.
2)TCP :傳輸控制協議
目前互聯網95%都是tcp傳輸控制協議 ; sctp爲tcp的升級版.
TCP的層次功能. 1)連接的建立: 2)數據打包成段: IP 打包成段最大的數據報文是65535 , 老的路由器器只有1550以下. 3)校驗和: 檢查數據報文發送過程中是否出現了錯誤. 4)確認: 報文確認. 5)超時機制: 6)排序機制: 爲了接收方可以確認和連接數據. 7)流量控制: 要有一個緩衝區發送緩存和接受緩存. 滑動窗口算法, 8)擁塞算法: 慢啓動,從少到多進行發送.
3)TCP 的有限狀態機
三次握手,四次斷開.
第一次握手:建立連接時,主機A發送SYN包(syn=m)到服務器,並進入SYN_SEND狀態,等待主機B確認 第二次握手:主機B收到SYN包,必須確認主機A的SYN(ACK=m+1),同時自己也發送一個SYN包(SYN=n),即SYN+ACK包,此時主機B進入SYN_RECV狀態 第三次握手:主機A收到主機B的SYN+ACK包,向主機B發送確認包ACK(ACK=n+1),此包發送完畢,主機A和主機B進入ESTABLISHED狀態,完成三次握手
當主機A完成數據傳輸後,將控制位FIN置1,提出停止TCP連接的請求 主機B收到FIN後對其作出響應,確認這一方向上的TCP連接將關閉,將ACK置1 由主機B端再提出反方向的關閉請求,將FIN置1 主機A對主機B的請求進行確認,將ACK置1,雙方向的關閉結束
三:套接字
套接字從本質上講是一個設備. ip+端口 綁定在某個服務上.
四:socket
主要用於不同主機間的進程間通信.
domain(識別sockt的方法) unix domain 同一主機不同進程間同信一種方式. IPV4 domain 藉助IPV4 實現不同主機間進程通信. IPV6 domain
兩臺主機通信過程.
進程註冊套接字
發送端主機內核-->發送緩衝區-->接收緩衝區-->接收端主機內核.
接收到內容要進行IO操作, 往往IO操作比較慢,需要緩衝區.