• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            隨筆-162  評論-223  文章-30  trackbacks-0
             
            模板
                1. 空基類優化
                2. 元編程技術
                    2.1. 選擇API
                    2.2. 計算最值
                    2.3. 類型選擇
                3. 封裝GCC原子操作
                4. 定制類對象的內存管理

            算法
                1. 排序
                    1.1. 改進的快速排序
                    1.2. 原位統計排序     
                2. 多叉樹
                    2.1. 深度優先存儲
                    2.2. 迭代器的設計
                    2.3. 前序遍歷
                    2.4. 后序遍歷
                    2.5. 兄弟遍歷
                    2.6. 葉子遍歷
                    2.7. 深度遍歷 
                3. 優先級隊列
                    3.1. 原理
                    3.2. 內幕
                    3.3. 外觀
                4. RSA加解密的證明
                5. DSA數字簽名的推導
                6. 基于中國剩余定理優化RSA解密推論的證明
                7. 總結AES加密涉及的數學定理
                8. 為什么素檢測存在概率多項式時間算法
                9. Blum數的基本定理及應用
                10. 論證有限域上平方根的求解

            GUI 
                1. MFC中的WM_COMMAND傳遞
                2. ATL和WTL中的消息反射
                3. 工作線程與消息循環
                4. 多窗口的組合與分離
                    4.1. 接口
                    4.2. 實現

            跨平臺
                1. 用戶態自旋鎖
                2. 互斥鎖
                3. 信號量
                4. socket管道
                5. 鎖框架的設計與實現

            網絡
                1. 運用狀態機異步接收變長包
                2. 基于OpenSSL實現的安全連接
                3. TCP/IP FAQ
                    3.1. 鏈路層、網絡層和傳輸層
                    3.2. 插口層和應用層
                4. Linux套接字與虛擬文件系統
                    4.1. 初始化和創建
                    4.2. 操作和銷毀
                5. Linux ICMP消息的產生與轉換
                6. nginx iocp
                    6.1. tcp異步連接
                    6.2. udp異步接收
                    6.3. scm服務控制
                7. TCP分組丟失時的狀態變遷
                8. 基于ENet實現可靠UDP通信的同步模型

            Shell應用
                1. 自動生成并安裝服務腳本
                2. nginx升級與恢復
                3. 使用awk定位反匯編輸出
                4. 自動化批量編譯
            posted @ 2014-04-10 16:04 春秋十二月 閱讀(1865) | 評論 (0)編輯 收藏
               為了方便更改系統tcp內核的一些參數,編寫ktcpopt腳本如下
            1#! /bin/bash 
            2# ktcpopt 
            3
            4sed -i '/net.ipv4.tcp_syncookies\|net.ipv4.tcp_tw_reuse\|net.ipv4.tcp_tw_recycle\|net.ipv4.tcp_fin_timeout\|net.ipv4.tcp_max_syn_backlog\|net.ipv4.tcp_max_tw_buckets\|net.ipv4.ip_local_port_range/d' /etc/sysctl.conf
            5
            6sed -i '$a\net.ipv4.tcp_syncookies=1\nnet.ipv4.tcp_tw_reuse=1\nnet.ipv4.tcp_tw_recycle=1\nnet.ipv4.tcp_fin_timeout=30\nnet.ipv4.tcp_max_syn_backlog=8192\nnet.ipv4.tcp_max_tw_buckets=5000\nnet.ipv4.ip_local_port_range=10000 65000' /etc/sysctl.conf

              為了方便配置程序的崩潰調試,編寫coredump腳本如下
            1#! /bin/bash
            2# coredump
            3
            4sed -i '/ulimit -c unlimited\|export core_path=\/tmp\/corefiles\|mkdir -p $core_path\|echo "0" > \/proc\/sys\/kernel\/core_uses_pid\|echo "$core_path\/%e" > \/proc\/sys\/kernel\/core_pattern/d' ~/.bashrc
            5
            6sed -i '$a\ulimit -c unlimited\nexport core_path=/tmp/corefiles\nmkdir -p $core_path\necho "0" > /proc/sys/kernel/core_uses_pid\necho "$core_path/%e" > /proc/sys/kernel/core_pattern' ~/.bashrc

               從以上2個腳本可以看出,為避免每次調用腳本時增加重復行以致配置文件逐漸變大,先刪除已經存在的相關配置,再在末尾增加。這里使用了sed來實現直接在文件中刪除和增加,其中由于刪除操作的匹配模式有多個,因此使用了|符號并用\轉義,并且第2個腳本模式文本中含有/符號,這與sed本身的模式限定符/存在歧義,因此也用了\轉義;增加使用$a\命令來實現在文件末尾增加配置,并用\n換行。
            posted @ 2014-03-24 18:44 春秋十二月 閱讀(1415) | 評論 (0)編輯 收藏
            腳本概述
               一般地,當在目標機器編譯安裝某個服務程序后,為了使服務能開機自啟動和關機自停止,則需要將其添加為系統服務。但不同的Linux系統管理服務的方法不同,如Ubuntu使用update-rc.d命令,而RedHat則使用chkconfig命令。因此為了能自動識別系統的類型,減少人工控制,編寫了一個簡單的autosrv腳本,要求至少1個最多2個參數,特點如下:
               ● 第1個參數只能為install或uninstall,表示安裝或卸載服務。
               ● 第2參數是可選的,表示系統名稱,如果沒有指定,那么會自動識別,若出現提示錯誤,則表示應該要顯式指定系統名稱了。

            腳本實現
              1#! /bin/bash
              2# autosrv
              3
              4if [ $# -lt 1 ]; then
              5    echo "Usage: $(basename "$0") install | uninstall [sysname]"
              6    exit
              7elif [ "$1" != "install" -a "$1" != "uninstall" ]; then
              8    echo "The first parameter must be install or uninstall" 
              9    exit
             10fi
             11
             12action=$1
             13sysname=$2
             14srv_path=/etc/init.d/srv_name
             15
             16if [ -z "$sysname" ]; then
             17    sysname=`lsb_release -a | sed -n '2p' | awk '{if($0~/[Uu][Bb][Uu][Nn][Tt][Uu]/) print "ubuntu"; else if($0~/[Dd][Ee][Bb][Ii][Aa][Nn]/) print "debian"; else if($0~/[Rr][Ee][Dd][Hh][Aa][Tt]/) print "redhat"; else if($0~/[Cc][Ee][Nn][Tt][Oo][Ss]/) print "centos"; else print ""}'`
             18    if [ -z "$sysname" ]; then
             19        echo "Unknown system, please manual special it with the second parameter"
             20        exit
             21    fi
             22    echo "Current system is $sysname"
             23fi
             24
             25create_file_ubuntu_debian()
             26{
             27cat << END > $srv_path
             28#! /bin/bash
             29. /lib/lsb/init-functions
             30
             31END
             32cat srv_name.body >> $srv_path
             33}
             34
             35create_file_redhat_centos()
             36{
             37cat << END > $srv_path
             38#! /bin/bash
             39#chkconfig:2345 90 10
             40#description: srv name
             41
             42. /etc/rc.d/init.d/functions
             43
             44END
             45cat srv_name.body >> $srv_path
             46}
             47
             48chmod_file()
             49{
             50    chmod u+x $srv_path
             51}
             52
             53remove_file()
             54{
             55    rm -f $srv_path
             56}
             57
             58install_ubuntu_debian()
             59{
             60    create_file_ubuntu_debian
             61    chmod_file
             62    update-rc.d srv_name defaults 90 10
             63}
             64
             65uninstall_ubuntu_debian()
             66{
             67    update-rc.d -f srv_name remove
             68    remove_file
             69}
             70
             71install_redhat_centos()
             72{
             73    create_file_redhat_centos
             74    chmod_file
             75    chkconfig --add srv_name
             76}
             77
             78uninstall_redhat_centos()
             79{
             80    chkconfig --del srv_name
             81    remove_file
             82}
             83
             84case "$sysname" in
             85    ubuntu|debian)
             86    if [ "$action" = "install" ]; then
             87        install_ubuntu_debian
             88    else
             89        uninstall_ubuntu_debian
             90    fi
             91    ;;
             92
             93    redhat|centos)
             94    if [ "$action" = "install" ]; then
             95        install_redhat_centos
             96    else
             97        uninstall_redhat_centos
             98    fi
             99    ;;
            100
            101    *)
            102    echo "Currently only support ubuntu, debian, redhat and centos system"
            103    exit
            104    ;;
            105esac
               從上可知,自動識別的方法是獲取lsb_release -a返回的文本再使用awk來匹配ubuntu,redhat,debian,centos這幾個子串(忽略大小寫)。要注意的是,返回的文本可能有所不同。

               當系統安裝了LSB模塊時,返回結果如下
               

               沒有安裝時,返回結果如下
               
               無論哪種情況,要提取分析的都是第2行文本,因此使用了sed -n '2p'。srv_name.body是不同系統相同的用于生成最終服務腳本的部分代碼文件,通常包含了start,stop,status,restart幾個函數,只是沒有包含前面的一部分,而這部分則由autosrv腳本來根據不同的系統生成不同的代碼。
            posted @ 2014-01-03 17:11 春秋十二月 閱讀(1981) | 評論 (1)編輯 收藏
                 摘要:    本文以系統的struct timeval為例,使其支持+、-、+=、-=4種算術運算和<,<=,>,>=,==、!= 6種關系運算,這樣一來就免去了顯式調用函數的麻煩,使代碼簡潔優雅,實現如下 Code highlighting produced by Actipro CodeHighlighter (freeware)htt...  閱讀全文
            posted @ 2013-10-28 23:37 春秋十二月 閱讀(1556) | 評論 (2)編輯 收藏
               繼上篇TCP/IP FAQ(1),本篇涵蓋了域和協議、IP編址、插口、原始IP、unix域方面的問題與解答。

            【Domain & Protocol】

            1. 什么是域,它和協議有什么關系?
               域可以理解為一種容納協議的空間,它的存在便于了協議的分類;域和協議是集合與元素的關系,一個域中的每個協議使用同類地址,并且每種地址只被一個域使用,一個域能由協議族或地址族常量唯一標識。
            2. TCP/IP中有哪些域及其協議?
               internet、iso、route、ccitt、imp、network systems和unix,其中internet域含有ip,icmp,igmp,tcp和udp五種協議,unix域用于ipc通信。
            3. 哪些地方會用到域?
               一個網絡層協議必須分用輸入數據報,并交給相應的傳輸層協議,由于域包含了協議族,因此必須從對應的域中找到合適的協議去處理。例如IP對應的域為internet,這個域對應的協議族為inetsw,當收到IP數據報時,就從inetsw中找到對應的傳輸層協議去輸入處理。

            【IP Addressing】
            1. IP地址有哪幾類?
               分為5類,A、B和C類用于單播;D類用于多播;E類用于實驗。
            2. sockaddr和sockaddr_in有什么區別聯系?
               sockaddr是一種通用的用于接口編址信息的結構,它將硬件與協議的地址細節相對于接口層隱藏起來,成員依次為sa_len、sa_family和sa_data,而sockaddr_in成員依次為sin_len、sin_family、sin_port、sin_addr和sin_zero。它們的前兩個成員其實是一樣的,只是命名不同,而sockaddr_in中的sin_port標識傳輸層的端口,sin_addr標識IP層的地址,所以它是Internet協議的專用接口編址結構,sin_zero僅為填充用,因為sockaddr_in長度不應小于sockaddr。
            3. 插口編址結構允許的最大長度是多少?
               sockaddr最后一個成員是可擴展的,這是C語言的通用技術,因為其第一個成員為u_char類型,所以最大長度是255。
            4. 一個接口可以配置多個IP地址,是怎么實現的?
               ifaddr表示通用的接口地址,ifnet表示接口,它有個類型為ifaddr*的if_addrlist成員,表示當前接口上的地址鏈表。in_ifaddr表示Internet協議專用的接口地址,而IP屬于Internet協議,因此用in_ifaddr表示,所有的IP地址組成一個類型為in_ifaddr*的鏈表。當增加一個IP地址時,就需要插入這兩個鏈表中;當刪除一個IP地址時,就需要從它們當中移除。
            5. 為什么配置IP主機地址和網絡掩碼可以是獨立的?
               因為它們使用不同的命令實現,前者用SIOCSIFADDR,后者用SIOCSIFNETMASK。當配置IP主機地址時,如果沒有指明網絡掩碼,那么網絡掩碼被設置成默認的。
            6. 為什么訪問IP接口地址使用的是UDP插口而不是原始IP插口?
               只有超級用戶用程才能創建原始IP插口,而通過UDP插口,任何用戶進程都能查看接口配置。

            【Socket】
            1. 為什么會存在插口層?
               從概念上講,tcp/ip協議棧劃分為鏈路、網絡、傳輸和應用4層;但從實現上講,在應用層和其下層中間,引入了一個插口層,作為進程和內核通信的橋梁,主要功能是將進程發送的與協議有關的請求映射到產生插口時指定的與協議有關的實現,從而屏蔽了不同協議處理的細節。
            2. 為什么服務器進程總是要調用bind,客戶進程能調用它嗎?
               bind將一個本地地址同一個插口相關聯,客戶進程需要同一個已知地址建立連接或發送數據報到已知地址,如果不調用bind,服務器進程就無法在某個已知地址上接受TCP連接或接收UDP數據報。客戶進程也能調用bind,這樣便可以由應用程序而非內核來選擇一個本地地址,其結果是只能接收目的地址為被綁定地址的數據包,但通常不必調用bind,因為內核會自動決定外出地址和臨時端口。
            3. 對于tcp和udp協議的插口,調用connect有什么區別聯系?
               共同點是設定插口的外部地址(插口的地址存儲在相關的協議控制塊中),不同點如下
               1)tcp:與遠端系統進行3次握手交互,如果插口是非阻塞的且連接正在進行中,那么返回EINPROGRESS,下次再調用則返回EALREADY;如果連接成功,無論是否阻塞,那么下次再調用會返回EISCONN;如果連接失敗,那么下次再調用,則重新開始三次握手。
               2)udp:沒有3次握手交互,直接設定外部地址,無論插口是否阻塞,調用會立即返回,多次調用則會替換老的外部地址。發送數據必須使用write或目的地址為空的sendto,若sendto目的地址非空,則返回EISCONN。如果沒有事先調用connect,那么調用目的地址為空的sendto則會返回ENOTCONN。
            4. 什么情況下調用close會阻塞?
               連接已建立且設置了SO_LINGER選項并延時值非零的阻塞插口。
            5. 插口IO有哪些系統調用?
               發送有write、writev、sendto和sendmsg,接收有read、readv、recvfrom和recvmsg。注意,send和recv是庫函數而非系統調用,前者調用sendto實現,后者調用recvfrom實現。
            6. write、writev、read、readv與sendto、sendmsg、recvfrom、recvmsg有什么不同?
               1)前面4個適合于任何描述符,而后面4個只能用于插口。
               2)前面4個不支持標志,而后面4個支持。
               3)前面前2個不支持目的地址、后2個不支持源地址,而后面前2個支持目的地址、后2個支持源地址。
               4)前面4個不支持控制信息,而后面第2個和第4個支持。
            7. 如何斷開已連接的udp插口,允許調用sendto向其它主機發送數據?
                由于系統并沒有提供形如disconnect的斷連API,但connect內部實現是先斷連,再調用對應協議的PRU_CONNECT請求處理,因此向connect傳遞無效的外部地址結構(如IP=0.0.0.0,Port=0),雖然這樣會導致結果失敗,但先前的斷連成功,對應pcb的外部地址被設為INADDR_ANY,所以調用sendto就不會返回EISCONN。

            【Raw IP】
            1. 怎么使用原始IP,它有哪些用途及應用?
               創建SOCK_RAW類型的原始插口,就能使用原始IP機制,它有下列用途:
               1)發送和接收ICMP和IGMP報文,如ping程序和多播路由守護程序。
               2)構造自己的IP首部,如路由跟蹤程序。
               3)設計基于IP的新的傳輸層協議,如gated程序。
            2. 協議值為PROTOCOL_RAW(255)的原始插口能收到什么類型的IP數據報?
               由于255是非零的保留值,這樣的IP數據報在網絡中不會存在,原始IP輸入處理協議比較測試失敗,因此收不到任何類型的IP數據報。
            3. 協議值為0的原始插口能收到什么類型的IP數據報?
               由于協議值為0,原始IP輸入處理忽略了協議比較測試,因此能收到任何類型的IP數據報。
            4. 如何處理收到的IP數據報?
               遍歷Internet PCB表,依次從協議值、本地地址和外部地址三項來比較IP數據報和每個PCB,將IP數據報復制追加到所有匹配的PCB對應的插口緩存中,并喚醒等待的進程。
            5. 如何發送數據?
               先填充IP首部,如果未設置IP_HDRINCL選項,那么由內核填充,否則由應用程序在發送前填充,再交給IP協議輸出處理。
            6. 內核何時會調用原始輸入?
               當收到的協議類型為除IPPROTO_TCP、IPPROTO_UDP、IPPROTO_ICMP和IPPROTO_IGMP外的IP數據報時調用。

            【Unix domain】
            1. 使用unix域的原因有哪些?
               1)當通信雙方在同一主機上時,使用unix域插口的速度比tcp和udp插口要快很多。
               2)支持同一主機進程間傳遞描述符。
            2. unix域和internet域有什么不同?
               1)編址結構不同:前者是sockaddr_un,與文件系統路徑名關聯,而后者是sockaddr_in,與IP地址和端口關聯。
               2)協議控制塊不同:前者是unpcb,沒有全局的pcb鏈表,而后者是inpcb,有全局的pcb雙向循環鏈表。
            3. 如果一個unix域服務器在bind后unlink了被綁定的路徑名,會發生什么情況?
               因為connect內部實現查找路徑名失敗,所以連接失敗,但listen會成功,因為bind會創建新的vnode和pcb關聯,且PRU_LISTEN請求實現只檢查vnode是否為空。
            4. 如果一個unix域服務器在終止時沒有unlink被綁定的路徑名,會發生什么情況?
               因為connect內部實現雖能找到路徑名但找不到相關的插口,所以連接被拒絕。
            5. 系統調用socketpair和pipe有什么區別聯系?
               共同點是使用unix域,即socket調用第1參數為AF_UNIX,不同點如下
               1)前者是雙工的,因為兩個插口標志都為讀寫,且它們的pcb相互指向對方;后者是單工的,因為一個插口標志為只讀,另一個為只寫,寫插口的pcb指向讀插口的pcb。
               2)前者支持數據報和流式插口,后者僅支持流式插口。
            6. unix域是怎么實現傳遞描述符的?
               描述符存儲在控制信息cmsghdr內,cms_level=SOL_SOCKET且cms_type=SCM_RIGHTS,unix域的發送請求實現將描述符轉換為file指針,這個過程叫內部化,接收請求實現把file指針轉換為最小的沒有使用的描述符,這個過程叫外部化。
            posted @ 2013-09-03 15:52 春秋十二月 閱讀(2388) | 評論 (1)編輯 收藏
               TCP/IP FAQ系列,以經典的4.4BSD-Lite實現為準,參考《TCP/IP協議詳解》3卷 ,加入個人的思考理解,理清主干,不深究細枝末節,皆在總結基本原理和實現。本篇涵蓋了數據鏈路層、ARP、RARP、IP、ICMP、TCP、UDP方面的問題與解答。

            【Data Link】
            1. 環回接口地址必須是127.0.0.1嗎?
               形如127.x.x.x的A類IP都可作為環回接口的地址,但常用的是127.0.0.1。
            2. 環回接口為什么沒有輸入處理?
               發送到環回接口的數據報實質上被送到網絡層的輸入隊列中,因此數據報沒有離開網絡,也就不可能從鏈路上接收到目標地址為環回接口地址的數據幀,所以不存在輸入處理。
            3. SLIP、環回和以太網接口,三者有何不同?
               SLIP和環回接口沒有鏈路層首部和硬件地址,環回接口沒有輸入處理,而以太網接口都有。
            4. SLIP和以太網接口如何分用輸入幀,環回接口如何分用輸出分組?
               SLIP將幀直接放進IP輸入隊列中,以太網接口則根據幀類型字段放到對應的協議輸入隊列中,環回接口則按目的地址族放到對應的輸入隊列中。
            5. 接口和地址有什么關聯?
               一個接口的編址信息包括主機地址、廣播地址和網絡掩碼,當內核初始化時,每個接口分配一個鏈路層地址,可以配置有多個相同或不同的網絡層地址,例如2個IP地址,或者1個IP地址、1個OSI地址。

            【ARP & RARP】
            1. 何時發送ARP請求,何時應答ARP請求?
               當單播發送IP數據并且查詢ARP高速緩存失敗時,就會廣播一個詢問目的主機硬件地址的ARP請求;當接收到ARP請求的主機就是該請求所要查找的目的主機或目的主機的ARP代理服務器時,就會單播一個ARP應答。
            2. 為什么兩者的以太網幀類型不同?
               ARP值為0x0806,RARP為0x8035,其實對于發送方來說,利用ARP的op字段可以區分RARP,但對于接收方,由于ARP實現在內核中,而RARP一般實現為服務器,所以為了更易區分,就單獨用另一個值標識。
            3. 設計RARP服務器有哪些問題?
               一是怎么發送以太網幀以響應請求,這與系統相關。二是當存在多個服務器時,同時發送響應幀會造成以太網沖突,這可以通過分主從服務器和隨機延時來優化避免。
            4. ARP在等待應答時,它會如何處理發往給定目的的多個報文?
               在大多數的實現中,在等待一個ARP應答時,只將最后一個報文發給特定目的主機。Host Requirements RFC要求實現中必須防止這種類型的ARP洪泛,建議最高速率是每秒一次。
            5. 免費ARP有什么作用?
               一般的ARP請求用于查詢目標硬件地址,并等待應答。而免費的ARP發出請求并不一定期望應答,這可以有兩方面的作用:
               1)一個主機可以確定是否存在相同IP地址的另一主機
               2)當本機硬件地址改變時,通知其它主機更新ARP高速緩存。
            6. ARP如何映射一個IP多播地址?
               先獲取IP多播地址的低23位,再與常量0x01005e7f0000按位或,結果就是對應的多播硬件地址。

            【IP】
            1. 何時何地分片?
               當數據報長度大于鏈路接口MTU且DF=0時,開始分片,分片可發生在源主機,也可發生在中途路由器。若需要分片但DF=1,則向源主機發送ICMP不可達差錯。
            2. 如何分片?
               1)計算每個分片的數據長度(不含IP首部),除后一個分片外,其它分片數據長度為8字節的倍數。
               2)除復制對應數據外,還復制原始分組的首部及(部分)選項到新的每個分片中,更新新分片首部的頭部長度、總長度、MF標志和偏移量。如果原始分組已經是分片,那么MF=1,否則最后一個分片MF=0,其余MF=1。
            3. 何時何地重裝?
               由于分片可以有不同的路由,而且中途路由器可能再次分片,因此只有目標主機才能重裝所有分片。當接收端第一次收到一個MF或偏移量非零的分組時,則該分組就是一個必須被重裝的分片,于是開始重裝。
            4. 如何重裝?
               1)使用4元組{源地址,目標地址,協議,16位標識}為唯一標識查找當前分片所屬的數據報(分片表),如果沒有找到,則創建分片表,按偏移量將當前分片插入到分片表,并啟動重裝定時器。
               2)如果重裝定時器超時后,還沒有組裝好一個完整的IP數據報,此時如果已經收到第一個分片,則向源主機返回ICMP超時差錯,最后丟棄收到的所有分片;否則,提交數據給適當的傳輸層處理。
            5. 哪些分組能被轉發,何時轉發?
               到達非最終目的地系統的分組,且當系統配置為可轉發或分組包含源路由時,才能被轉發,但下列類型的分組除外:1)鏈路層廣播 2)環回分組 3)網絡0和E類目標地址 4)D類目標地址。

            【ICMP】
            1. ICMP報文有哪些類型,何時何地生成這些報文?
               包括請求、應答、差錯和重定向4種,其中前兩者可統一為查詢類。請求當需要查詢的時候由進程生成,應答由當內核收到請求報文時生成,當主機發出的數據報無法成功地提交給目的主機時,目的主機或中間路由器的IP或傳輸協議生成差錯報文,并返回給原來的系統。
            2. 內核怎么處理收到的ICMP報文?
               ICMP是一種傳輸層協議,其協議號為1,當IP層收到一個ICMP報文時,分用交給ICMP協議輸入處理,ICMP協議輸入根據其類型分別處理:1)請求---生成適當的應答報文 2)差錯---提交給適當的傳輸層協議處理 3)應答---提交給等待ICMP報文的進程 4)重定向---更新路由表,并提交給等待的進程。
            3. 怎么發送ICMP報文?
               構造ICMP報文-->計算ICMP檢驗和-->封裝到IP數據報中-->提交給IP協議輸出處理,對于用戶進程,須使用原始IP機制才能發送。
            4. 哪些情況不會產生ICMP差錯報文,為什么?
               1)ICMP差錯報文:違反此條可能導致差錯引起差錯,無休止循環下去。
               2)源地址不是單播地址的IP數據報:違反此條導致差錯可能同時發到多個主機。
               3)目的地址是廣播或多播地址的IP數據報:違反此條導致多個主機可能同時響應。
               4)作為鏈路層廣播的數據報:違反此條導致多個主機可能同時響應。
               5)不是IP分片的第一片:違反此條可能導致產生多個ICMP差錯,每個分片一個。
               由此可見,違反以上幾條都會引起網絡風暴。

            【TCP & UDP】
            1. 為什么TCP首部存在首部長度字段,而UDP卻沒有?
               TCP首部存在選項,如mss,timestame,nop和wscale等。
            2. 為什么這兩種協議首部前面都是源和目的端口?
               當TCP收到一個ICMP差錯時,必須檢查兩個端口號以決定差錯對應于哪個連接;只有當UDP套接口連接到對端時,用戶進程才會收到ICMP差錯,例如當服務器未運行時,返回的ICMP端口不可達消息。
            3. 當收到TCP或UDP數據包時,怎么提交給應用層?
               插口由進程調用socket或accept創建,關聯到對應的PCB(協議控制塊)上,通配匹配數由本地和外部IP地址確定,有3種取值:0--本地和外部IP都不為*、1--本地或外部IP有一個為*和2--本地和外部IP都為*。與UDP不同的是,TCP還有自己的PCB。
               1)TCP:先掃描Internet PCB,查找最小通配匹配數的插口,如果沒找到,那么響應RST包;再查看對應的TCP PCB,若不存在則響應RST包,否則若TCP 狀態為關閉,則丟棄;最后交付給找到的對應插口。
               2)UDP:這里要分2種情況,對于目的地為廣播或多播地址的IP數據報,交付給所有匹配的插口;對于目的地為單播的IP數據報,掃描Internet PCB,查找具有最小通配匹配數的插口,如果沒有找到,則向源主機發送ICMP端口不可達差錯。如果有多個插口有相同的最小通配匹配數,那么具體由哪個插口接收依賴于不同的實現。
            4. 計算首部檢驗和時,為什么要引入偽首部?
               這是因為考慮到IP層的可能差錯,TCP和UDP需要驗證數據包是否被遞送到正確的協議和目的主機。
            5. UDP何時會計算檢驗和,如何區分是否使用了檢驗和?
               UDP的檢驗和是可選的,當系統沒有禁止(udpcksum非零)時,發送方會計算檢驗和,接收方還須輸入分組檢驗和非零時才會計算檢驗和。如果檢驗和字段非零,那么就使用了,反之沒有。
            6. 在TCP狀態遷移中,哪些狀態在什么情況下可直接轉到CLOSED狀態?
               SYN_SENT在連接定時器超時后,FIN_WAIT_2在FIN_WAIT_2定時器超時后。
            7. 為什么TCP需要持續(persist)定時器、FIN_WAIT_2定時器和2MSL定時器?
               1)因為連接對端發送的窗口通告為ACK報文,而ACK是不會確認的,允許TCP繼續發送數據的窗口更新可能會丟失,所以需要設定persist定時器,在超時后發送1字節的數據,判定對端接收窗口是否已打開。
               2)因為在正常情況下,當連接主動關閉時,會由FIN_WAIT_1狀態進入FIN_WAIT_2狀態等待接收對端的FIN報文,但對方可能一直不發送FIN,所以需要FIN_WAIT_2定時器避免連接永遠滯留在FIN_WAI_2狀態。
               3)因為當連接主動關閉進入TIME_WAIT狀態后,將等待2個MSL時間,在這段時間內,TCP可以重發丟失的ACK,丟棄來自新連接替身的遲到的報文段以防止被曲解,所以需要2MSL定時器,超時后關閉連接。
            8. 當TCP發送數據,調用ip_output返回ENOBUFS差錯時,可能會發生什么情況?
               當提交給網絡層因為內存不足發送失敗時,數據包被丟棄。如果丟棄的是數據報文,重傳定時器超時后數據將被重傳;如果丟棄的是純ACK報文,對端收不到ACK時會重傳對應的數據報文;如果丟棄的是RST報文,當對端重傳導致發送RST報文的數據報文時,將再次生成RST報文。
            9. TCP何時發送ACK報文?
               對于數據、SYN和FIN報文,發送ACK,但對于純ACK和RST報文,不會發送;另外當遇以下情況時,則立即發送。
               1)200ms延時ACK定時器超時;2)收到失序的報文段;3)三次握手收到了SYN;4)收到了FIN。
            10. TCP何時發送RST報文?
               1)當收到報文段,但沒有找到對應的internet pcb或tcp pcb。
               2)當連接處于LISTEN狀態時,收到了ACK報文段。
               3)當連接處于SYS_SENT狀態時,收到了錯誤的ACK報文段(ack小于等于iss或大于snd_max)。
               4)當連接被動關閉時(狀態大于CLOSE_WAIT),收到了數據。
               5)當連接處于SYN_RCVD狀態時,收到了錯誤的ACK報文段(ack小于snd_una或大于snd_max)。
            posted @ 2013-08-25 10:50 春秋十二月 閱讀(2565) | 評論 (1)編輯 收藏
               由于從其它平臺如windows傳輸文件到類unix平臺時,用vim等編輯工具打開時,有時會發現行尾有^M,其實這就是控制字符CR,ASCII碼為13。為方便刪除這個字符,編寫了一個簡單的dos2unix腳本,最多帶2個參數,特點如下:
               ● 第1個參數表示目標文件或目錄,當為文件時則處理非腳本本身的文件,當為目錄時則根據第2個參數是否遞歸處理子目錄。
               ● 第2個參數當且僅當第1個參數為目錄時有效,表示是否遞歸處理子目錄,當為空時則不處理,為-r時則處理。
             1#! /bin/bash
             2# dos2unix
             3
             4self_name=$(basename "$0")
             5self_dir=$(cd "$(dirname "$0")";pwd)
             6
             7transform_file()
             8{
             9    name=$(basename "$1")
            10    dir=$(dirname "$1")
            11
            12    if [ "$dir" = "." ]; then
            13        dir=$(pwd)
            14    fi
            15
            16    if "$dir" != "$self_dir" ] || [ "$name" != "$self_name" ]; then
            17        mv $1 $1.old
            18        sed 's/^M$//g' $1.old > $1
            19        rm $1.old
            20    fi
            21}

            22
            23transform_dir()
            24{
            25    local pdir=$(pwd)
            26    cd $1
            27    
            28    for s in `ls`
            29    do
            30        if [ -f "$s" ]; then
            31           transform_file "$s"
            32        else    
            33           if -"$s" ] && [ "$2" -eq "1" ]; then        
            34               transform_dir "$s" "1"            
            35           fi 
            36        fi            
            37    done                
            38
            39    cd $pdir
            40
            41

            42transform()
            43{
            44    if -"$1" ]; then
            45        transform_file "$1"
            46    else
            47        if -"$2" ]; then
            48            is_r=0
            49        else
            50            if "$2" = "-r" ]; then
            51                is_r=1
            52            else
            53                echo "Usage: $(basename $0) directory -r"
            54                return 1
            55            fi
            56        fi
            57
            58        if -"$1" ]; then
            59            transform_dir "$1" "$is_r"
            60        else
            61            echo "$1 is neither file nor directory"
            62            return 1
            63        fi        
            64    fi
            65}

            66
            67if -"$1" ]; then
            68    transform $1 $2
            69else
            70    echo "Usage: $(basename $0) file or directory [-r]"
            71    exit 1
            72fi
            posted @ 2013-08-08 19:06 春秋十二月 閱讀(7700) | 評論 (5)編輯 收藏
                 摘要:      由于read、readv、write和writev函數一次讀或寫有時并不能滿足所要求的數據,因此需要多次調用直到要求的字節數或者出錯。針對這4個系統調用,編寫了對應的xxxn版本,實現如下 Code highlighting produced by Actipro CodeHighlighter (freeware)http:...  閱讀全文
            posted @ 2013-08-02 19:44 春秋十二月 閱讀(1784) | 評論 (0)編輯 收藏
                 摘要: 基本原理   1)系統CPU使用率等于兩個時間點的CPU非空閑時間差除以CPU時間總量差得到的百分比,這兩者可從/proc/stat文件獲得。   2)系統內存使用率等于系統物理內存消耗量除以系統物理內存總量(memtotal,以KB為單位)得到的百分比,這兩者可從/proc/meminfo文件獲得。   3...  閱讀全文
            posted @ 2013-05-31 19:04 春秋十二月 閱讀(4980) | 評論 (0)編輯 收藏
                 摘要: 情景分析   現已存在一個可用穩定的異步客戶端類http_client_base,該類基于boost asio實現了連接服務器,發送請求,獲取響應和解析http數據等操作,該類的大致實現框架如下 Code highlighting produced by Actipro CodeHighlighter (freeware) http://www.C...  閱讀全文
            posted @ 2013-03-20 20:47 春秋十二月 閱讀(12351) | 評論 (2)編輯 收藏
            僅列出標題
            共17頁: First 7 8 9 10 11 12 13 14 15 Last 
            国产精品成人精品久久久| 青青草国产成人久久91网| 欧美精品九九99久久在观看| 国内精品久久久久久中文字幕| 久久夜色撩人精品国产| 久久综合亚洲鲁鲁五月天| 亚洲国产精品18久久久久久| 久久亚洲国产午夜精品理论片| 久久精品国产亚洲AV不卡| 国产香蕉久久精品综合网| 97精品久久天干天天天按摩| 手机看片久久高清国产日韩| 久久久精品人妻一区二区三区四| 国产精品日韩欧美久久综合| 日本欧美久久久久免费播放网| 色综合久久中文综合网| 久久国产免费直播| 久久有码中文字幕| 亚洲乱亚洲乱淫久久| 无码精品久久久天天影视| 亚洲性久久久影院| 国产精品99久久久久久宅男| 91精品国产综合久久精品| 狠狠色丁香婷婷久久综合五月| 久久免费高清视频| 久久精品麻豆日日躁夜夜躁| 性做久久久久久久久久久| 久久精品国产欧美日韩| 青青热久久综合网伊人| 免费观看久久精彩视频| 欧美综合天天夜夜久久| 狠狠色丁香婷婷久久综合不卡| 中文字幕热久久久久久久| 精品国产乱码久久久久软件| 97香蕉久久夜色精品国产 | 日产精品久久久久久久性色| 亚洲国产精品狼友中文久久久 | 久久99精品久久久久久动态图| 久久妇女高潮几次MBA| 久久婷婷人人澡人人爽人人爱| 欧美日韩精品久久免费|