為什么要使用分層網絡模型
降低復雜性
標準化接口
簡化模塊化設計
確保技術的互操作性
加快發展速度
簡化教學
OSI模型的七層結構:(必須記住)
數據封裝
數據解封
以太網橋
交換式以太網的優勢:
擴展了網絡帶寬
分割了網絡沖突域,使網絡沖突被限制在最小的范圍內
交換機作為更加智能的交換設備,能夠提供更多用戶所要求的功能:優先級、虛擬網、遠程檢測……
以太網橋工作原理
以太網橋監聽數據幀中源MAC地址,學習MAC,建立MAC表
對于未知MAC地址,網橋將轉發到除接收該幀的端口之外的所有端口
當網橋接到一個數據幀時,如果該幀的目的位于接收端口所在網段上,它就過濾掉該數據幀;如果目的MAC地址在位于另外一個端口,網橋就將該幀轉發到該端口
當網橋接到廣播幀時候,它立即轉發到除接收端口之外的所有其他端口
TCP/IP 協議棧
Transmission Control Protocol
/Internet Protocol
傳輸控制協議/因特網互聯協議
TCP/IP是一個Protocol Stack,包括TCP、IP、UDP、ICMP、RIP、TELNET、FTP、SMTP、ARP等許多協議
最早發源于美國國防部(縮寫為DoD)的因特網的前身ARPA網項目,1983年1月1日,TCP/IP取代了舊的網絡控制協議NCP,成為今天的互聯網和局域網的基石和標準。由互聯網工程任務組負責維護。
共定義了四層
和ISO參考模型的分層有對應關系
TCP/IP 協議棧和 OSI 模型
TCP特性
工作在傳輸層面向連接協議
全雙工協議
半關閉
錯誤檢查
將數據打包成段,排序
確認機制
數據恢復,重傳
流量控制,滑動窗口
擁塞控制,慢啟動和擁塞避免算法
源端口、目標端口:計算機上的進程要和其他進程通信是要通過計算機端口的,而一個計算機端口某個時刻只能被一個進程占用,所以通過指定源端口和目標端口,就可以知道是哪兩個進程需要通信。源端口、目標端口是用16位表示的,可推算計算機的端口個數為2^16個
序列號:表示本報文段所發送數據的第一個字節的編號。在TCP連接中所傳送的字節流的每一個字節都會按順序編號。由于序列號由32位表示,所以每2^32個字節,就會出現序列號回繞,再次從0 開始
確認號:表示接收方期望收到發送方下一個報文段的第一個字節數據的編號。也就是告訴發送發:我希望你(指發送方)下次發送的數據的第一個字節數據的編號是這個確認號。也就是告訴發送方:我希望你(指發送方)下次發送給我的TCP報文段的序列號字段的值是這個確認號
數據偏移:由于TCP首部包含一個長度可變的選項部分,所以需要這么一個值來指定這個TCP報文段到底有多長。它指出TCP 報文段的數據起始處距離TCP 報文段的起始處有多遠,即TCP報文段的首部長度。該字段的單位是32位字,即:4個字節
URG:表示本報文段中發送的數據是否包含緊急數據。后面的緊急指針字段(urgent pointer)只有當URG=1時才有效
ACK:表示是否前面的確認號字段是否有效。ACK=1,表示有效。只有當ACK=1時,前面的確認號字段才有效。TCP規定,連接建立后,ACK必須為1,帶ACK標志的TCP報文段稱為確認報文段
PSH:提示接收端應用程序應該立即從TCP接收緩沖區中讀走數據,為接收后續數據騰出空間。如果為1,則表示對方應當立即把數據提交給上層應用,而不是緩存起來,如果應用程序不將接收到的數據讀走,就會一直停留在TCP接收緩沖區中
RST:如果收到一個RST=1的報文,說明與主機的連接出現了嚴重錯誤(如主機崩潰),必須釋放連接,然后再重新建立連接?;蛘哒f明上次發送給主機的數據有問題,主機拒絕響應,帶RST標志的TCP報文段稱為復位報文段
SYN:在建立連接時使用,用來同步序號。當SYN=1,ACK=0時,表示這是一個請求建立連接的報文段;當SYN=1,ACK=1時,表示對方同意建立連接。SYN=1,說明這是一個請求建立連接或同意建立連接的報文。只有在前兩次握手中SYN才置為1,帶SYN標志的TCP報文段稱為同步報文段
FIN:表示通知對方本端要關閉連接了,標記數據是否發送完畢。如果FIN=1,即告訴對方:“我的數據已經發送完畢,你可以釋放連接了”,帶FIN標志的TCP報文段稱為結束報文段
窗口大?。罕硎粳F在運行對方發送的數據量,也就是告訴對方,從本報文段的確認號開始允許對方發送的數據量
校驗和:提供額外的可靠性
緊急指針:標記緊急數據在數據字段中的位置。
選項部分:其最大長度可根據TCP首部長度進行推算。TCP首部長度用4位表示,選項部分最長為:(2^4-1)*4-20=40字節
TCP三次握手(必記)
第一次握手:建立連接??蛻舳税l送連接請求報文段,將SYN位置為1,Sequence Number為x;然后,客戶端進入SYN_SEND狀態,等待服務器的確認
第二次握手:服務器收到SYN報文段。服務器收到客戶端的SYN報文段,需要對這個SYN報文段進行確認,設置Acknowledgment Number為x+1(Sequence Number+1);同時,自己自己還要發送SYN請求信息,將SYN位置為1,Sequence Number為y;服務器端將上述所有信息放到一個報文段(即SYN+ACK報文段)中,一并發送給客戶端,此時服務器進入SYN_RECV狀態
第三次握手:客戶端收到服務器的SYN+ACK報文段。然后將Acknowledgment Number設置為y+1,向服務器發送ACK報文段,這個報文段發送完畢以后,客戶端和服務器端都進入ESTABLISHED狀態,完成TCP三次握手
TCP四次揮手(必記)
第一次分手:主機1(可以使客戶端,也可以是服務器端),設置Sequence Number和Acknowledgment Number,向主機2發送一個FIN報文段;此時,主機1進入FIN_WAIT_1狀態;這表示主機1沒有數據要發送給主機2了
第二次分手:主機2收到了主機1發送的FIN報文段,向主機1回一個ACK報文段,Acknowledgment Number為Sequence Number加1;主機1進入FIN_WAIT_2狀態;主機2告訴主機1,我“同意”你的關閉請求
第三次分手:主機2向主機1發送FIN報文段,請求關閉連接,同時主機2進入LAST_ACK狀態
第四次分手:主機1收到主機2發送的FIN報文段,向主機2發送ACK報文段,然后主機1進入TIME_WAIT狀態;主機2收到主機1的ACK報文段以后,就關閉連接;此時,主機1等待2MSL后依然沒有收到回復,則證明Server端已正常關閉,那好,主機1也可以關閉連接了
上圖名詞解釋:
CLOSED 沒有任何連接狀態
LISTEN 偵聽狀態,等待來自遠方TCP端口的連接請求
SYN-SENT 在發送連接請求后,等待對方確認
SYN-RECEIVED 在收到和發送一個連接請求后,等待對方確認
ESTABLISHED 代表傳輸連接建立,雙方進入數據傳送狀態
FIN-WAIT-1 主動關閉,主機已發送關閉連接請求,等待對方確認
FIN-WAIT-2 主動關閉,主機已收到對方關閉傳輸連接確認,等待對方發送關閉傳輸連接請求
TIME-WAIT 完成雙向傳輸連接關閉,等待所有分組消失
CLOSE-WAIT 被動關閉,收到對方發來的關閉連接請求,并已確認
LAST-ACK 被動關閉,等待最后一個關閉傳輸連接確認,并等待所有分組消失
CLOSING 雙方同時嘗試關閉傳輸連接,等待對方確認
客戶端的典型狀態轉移
客戶端通過connect系統調用主動與服務器建立連接connect系統調用首先給服務器發送一個同步報文段,使連接轉移到SYN_SENT狀態。
此后connect系統調用可能因為如下兩個原因失敗返回:
1、如果connect連接的目標端口不存在(未被任何進程監聽),或者該端口仍被處于TIME_WAIT狀態的連接所占用(見后文),則服務器將給客戶端發送一個復位報文段,connect調用失敗。
2、如果目標端口存在,但connect在超時時間內未收到服務器的確認報文段,則connect調用失敗。
connect調用失敗將使連接立即返回到初始的CLOSED狀態。如果客戶端成功收到服務器的同步報文段和確認,則connect調用成功返回,連接轉移至ESTABLISHED狀態
當客戶端執行主動關閉時,它將向服務器發送一個結束報文段,同時連接進入FIN_WAIT_1狀態。若此時客戶端收到服務器專門用于確認目的的確認報文段,則連接轉移至FIN_WAIT_2狀態。當客戶端處于FIN_WAIT_2狀態時,服務器處于CLOSE_WAIT狀態,這一對狀態是可能發生半關閉的狀態。此時如果服務器也關閉連接(發送結束報文段),則客戶端將給予確認并進入TIME_WAIT狀態
客戶端從FIN_WAIT_1狀態可能直接進入TIME_WAIT狀態(不經過FIN_WAIT_2狀態),前提是處于FIN_WAIT_1狀態的服務器直接收到帶確認信息的結束報文段(而不是先收到確認報文段,再收到結束報文段)
處于FIN_WAIT_2狀態的客戶端需要等待服務器發送結束報文段,才能轉移至TIME_WAIT狀態,否則它將一直停留在這個狀態。如果不是為了在半關閉狀態下繼續接收數據,連接長時間地停留在FIN_WAIT_2狀態并無益處。連接停留在FIN_WAIT_2狀態的情況可能發生在:客戶端執行半關閉后,未等服務器關閉連接就強行退出了。此時客戶端連接由內核來接管,可稱之為孤兒連接(和孤兒進程類似)。
Linux為了防止孤兒連接長時間存留在內核中,定義了兩個內核參數:
/proc/sys/net/ipv4/tcp_max_orphans 指定內核能接管的孤兒連接數目
/proc/sys/net/ipv4/tcp_fin_timeout 指定孤兒連接在內核中生存的時間
TCP超時重傳
異常網絡狀況下(開始出現超時或丟包),TCP控制數據傳輸以保證其承諾的可靠服務
TCP服務必須能夠重傳超時時間內未收到確認的TCP報文段。為此,TCP模塊為每個TCP報文段都維護一個重傳定時器,該定時器在TCP報文段第一次被發送時啟動。如果超時時間內未收到接收方的應答,TCP模塊將重傳TCP報文段并重置定時器。至于下次重傳的超時時間如何選擇,以及最多執行多少次重傳,就是TCP的重傳策略
與TCP超時重傳相關的兩個內核參數:
/proc/sys/net/ipv4/tcp_retries1,指定在底層IP接管之前TCP最少執行的重傳次數,默認值是3
/proc/sys/net/ipv4/tcp_retries2,指定連接放棄前TCP最多可以執行的重傳次數,默認值是15(一般對應13~30min)
擁塞控制
TCP為提高網絡利用率,降低丟包率,并保證網絡資源對每條數據流的公平性。即所謂的擁塞控制
TCP擁塞控制的標準文檔是RFC 5681,其中詳細介紹了擁塞控制的四個部分:慢啟動(slow start)、擁塞避免(congestion avoidance)、快速重傳(fast retransmit)和快速恢復(fast recovery)。擁塞控制算法在Linux下有多種實現,比如reno算法、vegas算法和cubic算法等。它們或者部分或者全部實現了上述四個部分
當前所使用的擁塞控制算法
/proc/sys/net/ipv4/tcp_congestion_control
TCP協議
傳輸層通過port號,確定應用層協議
Port number:
tcp:傳輸控制協議,面向連接的協議;通信前需要建立虛擬鏈路;結束后拆除鏈路
0-65535
udp:User Datagram Protocol,無連接的協議
0-65535
IANA:互聯網數字分配機構(負責域名,數字資源,協議分配)
0-1023:系統端口或特權端口(僅管理員可用) ,眾所周知,永久的分配給固定的系統應用使用,22/tcp(ssh), 80/tcp(http), 443/tcp(https)
1024-49151:用戶端口或注冊端口,但要求并不嚴格,分配給程序注冊為某應用使用,1433/tcp(SqlServer),1521/tcp(oracle),
3306/tcp(mysql),11211/tcp/udp(memcached)
49152-65535:動態端口或私有端口,客戶端程序隨機使用的端口
其范圍的定義:/proc/sys/net/ipv4/ip_local_port_range
原創文章,作者:木,如若轉載,請注明出處:http://www.www58058.com/75031