網絡及TCP

為什么要使用分層網絡模型

    降低復雜性

    標準化接口

    簡化模塊化設計

    確保技術的互操作性

    加快發展速度

    簡化教學

OSI模型的七層結構:(必須記住)

網絡及TCP

網絡及TCP網絡及TCP網絡及TCP網絡及TCP網絡及TCP網絡及TCP網絡及TCP

數據封裝

網絡及TCP

數據解封

網絡及TCP

以太網橋

交換式以太網的優勢:
    擴展了網絡帶寬
    分割了網絡沖突域,使網絡沖突被限制在最小的范圍內
    交換機作為更加智能的交換設備,能夠提供更多用戶所要求的功能:優先級、虛擬網、遠程檢測……
以太網橋工作原理

以太網橋監聽數據幀中源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

TCP特性

    工作在傳輸層面向連接協議
    全雙工協議
    半關閉
    錯誤檢查
    將數據打包成段,排序
    確認機制
    數據恢復,重傳
    流量控制,滑動窗口
    擁塞控制,慢啟動和擁塞避免算法

TCP包頭

網絡及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三次握手(必記)

網絡及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四次揮手(必記)

網絡及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

(0)
木
上一篇 2017-05-08
下一篇 2017-05-08

相關推薦

  • httpd服務歸納:httpd簡介與基本安裝

    一、httpd 簡介  1. httpd 歷史: httpd daemon 最早誕生于1995年二月, 伊利諾伊大學香檳分校的美國國家超級計算應用中心(NCSA),由Rob McCool開發。當這個項目完成后,Rob 老兄離開RCSA以后,這個項目組就解散了,這個項目也隨之終止。 但是,由Brian Behlendorf 和 Cliff …

    Linux干貨 2015-05-07
  • Linux發展史

    前言     Linux屬于類Unix中的一個當下比較流行的操作系統,占領了服務器大部分江山。作為一個專業復雜的操作系統,了解其發展過程是很有必要的。如果要講linux的歷史,肯定是從三個團體開發Multics系統說起,貝爾實驗室離開Multics項目后,Tompson和他的同事一起創造了unix,而在unix的各種分支中BSD則是迅速發…

    Linux干貨 2016-10-14
  • 通過Nginx來安裝一個Discuz

    這次由于時間有限,所以我就沒有用編譯安裝來啟動LMP,只有Nginx 是編譯安裝的 因為是在centos7上面安裝的Nginx所以我們這里由于能力有限,暫時不能將其加入開機啟動,日后我會進行改進,將其加入開機啟動。這里我們給出Nginxd的編譯選項及環境   yum groupinstall "Development&…

    Linux干貨 2016-10-30
  • centos系統中常用的命令

    日志文件說明:  /var/log/message      系統啟動后的信息和錯誤日志,是Red Hat Linux中最常用的日志之一   /var/log/secure      &nb…

    Linux干貨 2016-06-28
  • ArchLinux折騰記

    剛接觸linux的時候, 聽到前輩說到這樣一個系統,  說是linux 技能純熟才能駕馭的了ArchLinux , 最近正好有個半天閑, 于是抽空,  佐以官方文檔,  來認認真真的折騰一下ArchLinux Contents ArchLinux簡介  準備工作  分區設置  基本功能安裝 &nbs…

    Linux干貨 2016-09-29
  • Codis集群3.03安裝配置基礎

    Codis基礎 01.codis是一個分布式的Redis解決方案,對于上層的應用來說,連接Codis Proxy和連接原生的Redis Server沒有明顯的區別。 codis底層會處理請求的轉發,不停機的數據遷移等工作,所有后邊的一切事情,對于前面客戶端來說是透明的,可以簡單的認為后邊連接是一個內存無限大的Redis服務。 codis架構圖如下: 02.c…

    Linux干貨 2016-09-26
欧美性久久久久