• <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>
            隨筆-159  評論-223  文章-30  trackbacks-0
               繼上篇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 on 2013-09-03 15:52 春秋十二月 閱讀(2370) 評論(1)  編輯 收藏 引用 所屬分類: Network

            評論:
            # re: TCP/IP FAQ 2[未登錄] 2013-09-04 13:22 | jacky
            socket一般翻譯為套接字比較好吧  回復  更多評論
              
            久久99国产精品尤物| 中文精品久久久久人妻不卡| 亚洲国产精品久久久久| 久久亚洲国产午夜精品理论片| 久久午夜综合久久| 香蕉久久av一区二区三区| 香蕉久久夜色精品国产小说| 亚洲国产精品一区二区三区久久| 亚洲AV无码久久| 久久精品国产精品亚洲| 亚洲国产精品久久电影欧美| 丁香五月综合久久激情| 无码人妻久久一区二区三区免费丨 | 伊人久久亚洲综合影院| 国产精品久久久久久| 亚洲精品tv久久久久| 超级碰久久免费公开视频| 国内精品久久久久久久久电影网| 国产成人AV综合久久| 久久精品亚洲一区二区三区浴池| 久久se这里只有精品| 精品久久久噜噜噜久久久| 久久午夜免费视频| 色偷偷88欧美精品久久久| 天天爽天天爽天天片a久久网| 久久综合九色综合网站| 久久久亚洲AV波多野结衣| 日本亚洲色大成网站WWW久久| 草草久久久无码国产专区| 国产91色综合久久免费| 精品蜜臀久久久久99网站| 久久99国产综合精品| 色综合久久无码五十路人妻| 亚洲va久久久噜噜噜久久男同| 久久午夜夜伦鲁鲁片免费无码影视| 久久精品国产精品亚洲人人| 国产日韩久久免费影院| 99久久成人18免费网站| 久久久久无码精品国产app| 久久久亚洲精品蜜桃臀| 精品免费久久久久国产一区|