Table of Contents, Show Frames, No Frames

µÚÊ®ÕÂ
ÍøÂç


    ÍøÂçºÍLinuxÊÇÃÜÇÐÏà¹ØµÄ¡£´ÓijÖÖÒâÒåÀ´ËµLinuxÊÇÒ»¸öÕë¶ÔInternetºÍWWWµÄ²úÆ·¡£ËüµÄ¿ª·¢ÕߺÍÓû§ÓÃWebÀ´½»»»ÐÅϢ˼Ïë¡¢³ÌÐò´úÂ룬¶øLinux×ÔÉí³£³£±»ÓÃÀ´Ö§³Ö¸÷ÖÖ×éÖ¯»ú¹¹µÄÍøÂçÐèÇó¡£ÕâÒ»Õ½²µÄÊÇLinuxÈçºÎÖ§³ÖÈçTCP/IPµÈÍøÂçЭÒéµÄ¡£

    TCP/IPЭÒé×î³õÊÇΪ֧³ÖARPANET£¨Ò»¸öÃÀ¹úÕþ¸®×ÊÖúµÄÑо¿ÐÔÍøÂ磩ÉϼÆËã»úͨѶ¶øÉè¼ÆµÄ¡£ARPANET Ìá³öÁËÒ»Ð©ÍøÂç¸ÅÄîÈç°ü½»»»ºÍЭÒé·Ö²ã£¨Ò»¸öЭÒéʹÓÃÁíÒ»¸öЭÒéÌṩµÄ·þÎñ£©¡£ARPANETÓÚ1988ÄêÒþÍË£¬µ«ÊÇËüµÄ¼Ì³ÐÈË(NSF1 NETºÍInternet£©È´±äµÃ¸ü´óÁË¡£ÏÖÔÚÎÒÃÇËùÊìÖªµÄÍòÎ¬ÍøWorld Wide Web¾ÍÊÇ´ÓARPANETÑݱä¹ýÀ´µÄ£¬Ëü×ÔÉíÖ§³ÖTCP/IPЭÒé¡£Unix TM ±»¹ã·ºÓ¦ÓÃÓÚARPANET£¬ËüµÄµÚÒ»¸öÍøÂç°æ±¾ÊÇ4.3 BSD¡£LinuxµÄÍøÂçʵÏÖÊÇÒÔ4.3 BSDΪģÐ͵ģ¬ËüÖ§³ÖBSD sockets(¼°Ò»Ð©À©Õ¹)ºÍËùÓеÄTCP/IPÍøÂ硣ѡÕâ ¸ö±à³Ì½Ó¿ÚÊÇÒòΪËüºÜÁ÷ÐУ¬²¢ÇÒÓÐÖúÓÚÓ¦ÓóÌÐò´ÓLinuxÆ½Ì¨ÒÆÖ²µ½ÆäËüUnix TM Æ½Ì¨¡£

10.1  TCP/IPÍøÂç¼ò½é

    ÕâÒ»²¿·Ö¼òµ¥½éÉÜÒ»ÏÂTCP/IPÍøÂçµÄÖ÷ÒªÔ­Àí£¬¶ø²»ÊǽøÐÐÏêϸµØ½²Êö¡£ÔÚIPÍøÂçÖУ¬Ã¿Ì¨»úÆ÷¶¼ÓÐÒ»¸ö IP µØÖ·£¬Ò»¸ö32λµÄÊý×Ö£¬ËüΨһµØ±êʶÕą̂»úÆ÷¡£WWWÊÇÒ»¸ö·Ç³£¾Þ´ó²¢ÇÒѸËÙÔö³¤µÄÍøÂ磬ÿ̨Á¬ÔÚÉÏÃæµÄ»úÆ÷¶¼±ØÐëÓÐÒ»¸ö¶ÀÁ¢µÄIPµØÖ·¡£IPµØÖ·ÓÉËĸöÓõã·Ö¿ªµÄÊý×Ö±íʾ£¬Èç16.42.0.9¡£Õâ¸öIPµØÖ·Êµ¼ÊÉÏ·Ö³ÉÁ½¸ö²¿·Ö£ºÍøÂçµØÖ·ºÍÖ÷»úµØÖ·£¬Ã¿²¿·ÖµÄ³¤¶ÈÊÇ¿ÉÒԱ仯µÄ£¨Óкü¸ÀàIPµØÖ·£©¡£ÒÔ16.42.0.9ΪÀý£¬ÍøÂçµØÖ·ÊÇ16.42£¬Ö÷»úµØÖ·ÊÇ0.9¡£Ö÷»úµØÖ·ÓÖ½øÒ»²½·ÖΪ×ÓÍøµØÖ·ºÍÖ÷»úµØÖ·¡£»¹ÊÇÒÔ16.42.0.9ΪÀý£¬×ÓÍøµØÖ·ÊÇ16.42.0£¬Ö÷»úµØÖ·ÊÇ16.42.0.9¡£ÕâÑùµÄ×Ó»®·Ö¿ÉÒÔÔÊÐíij²¿ÃÅ»®·ÖËûÃÇ×Ô¼ºµÄ×ÓÍøÂç¡£ÀýÈ磬Èç¹û16.42ÊÇACME¼ÆËã»ú¹«Ë¾µÄÍøÂçµØÖ·£¬Ôò16.42.0¿ÉÄÜÊÇ×ÓÍø0£¬16.42.1¿ÉÄÜÊÇ×ÓÍø1¡£ ÕâЩ×ÓÍø¿ÉÒÔÊÇ·Ö±ð½¨Á¢µÄ£¬¿ÉÄÜ×âÓõ绰Ïß»òÓÃ΢²¨½øÐÐÏ໥¼äͨѶ¡£IPµØÖ·ÓÉÍøÂç¹ÜÀíÔ±·ÖÅ䣬ÓÃIP ×ÓÍø¿ÉÒԺܺõعÜÀíÍøÂç¡£IP×ÓÍøµÄ¹ÜÀíÔ±¿ÉÒÔ×ÔÓÉ·ÖÅä×ÓÍøÄÚµÄIPµØÖ·¡£

    Í¨³££¬IPµØÖ·ÊDZȽÏÄѼǵ쬶øÃû³ÆÔòÈÝÒ×¶àÁË£¬Ïólinux.acme.com¾Í±È16.42.0.9ÒªºÃ¼ÇһЩ¡£µ«ÊDZØÐëÓÐһЩ»úÆ÷À´½«ÍøÂçÃû³Æ×ª±äΪIPµØÖ·¡£ÕâЩÃû³Æ±»¾²Ì¬µØ¶¨ÒåÔÚ /etc/hosts ÎļþÖлòÕßLinuxÄÜÇëÇóÓòÃû·þÎñÆ÷(DNS)À´½âÎöËü¡£ÕâÖÖÇé¿öÏ£¬±¾µØÖ÷»ú±ØÐëÖªµÀÒ»¸ö»òÒ»¸öÒÔÉϵÄDNS·þÎñÆ÷²¢ÇÒÕâЩ·þÎñÆ÷Òª½«ÆäÃû³ÆÖ¸¶¨µ½ /etc/resolv.conf ÖС£

    µ±ÄãÏëÒªÓëÁíһ̨¼ÆËã»úÁ¬½Óʱ£¬±ÈÈç˵ÄãÏëÔĶÁÒ»¸öWebÒ³£¬ÄãµÄIPµØÖ·¾Í»á±»ÓÃÀ´ÓëÄÇ̨»úÆ÷½»»»Êý¾Ý¡£ÕâЩÊý¾Ý±»°üº¬ÔÚһЩIP°üÖУ¬Ã¿¸öIP°ü¶¼ÓÐÒ»¸öIPÍ·ÓÃÀ´°üº¬Ô´»úÆ÷µÄIPµØÖ·ºÍÄ¿µÄ»úÆ÷µÄIPµØÖ·£¬Ð£ÑéºÍÒÔ¼°ÆäËüµÄÓÐÓÃÐÅÏ¢¡£IP°üµÄУÑéºÍÓÃÀ´ÈÃIP°üµÄ½ÓÊÕ¶ËÅжÏIP°üÊÇ·ñÔÚ´«Êä¹ý³ÌÖз¢Éú´íÎ󣬯©Èç˵ÓÉÓڵ绰Ïß·µÄÎÊÌâ¶øÒýÆðµÄ´íÎó¡£Ó¦ÓóÌÐòÏëÒª´«ÊäµÄÊý¾Ý¿ÉÄܱ»·Ö³ÉºÜ¶à¸öÈÝÒ×´¦ÀíµÄС°ü¡£IPÊý¾Ý°üµÄ´óСÊǸù¾Ý´«ÊäýÌåµÄ±ä»¯¶ø²»Í¬µÄ£»ÒÔÌ«Íø°üͨ³£±ÈPPP°üÒª´óһЩ¡£Ä¿µÄÖ÷»úÔÚ½«Êý¾ÝË͸ø½ÓÊÕ¶ËÓ¦ÓóÌÐòǰÐèÒª½«ÕâЩ°üÖØÐÂÞÕ×°ÆðÀ´¡£Èç¹ûÄã´ÓÒ»¸ö±È½ÏÂýµÄÕ¾µã·ÃÎÊÒ»¸öÓдóÁ¿Í¼ÏóµÄWebÒ³£¬¾Í»á¿´µ½Êý¾ÝµÄ·Ö¸îÓëÖØ×é¡£

    Í¬Ò»×ÓÍøÄÚµÄÖ÷»úÖ®¼ä¿ÉÒÔÖ±½Ó·¢ËÍIP°ü£¬¶øÆäËüµÄIP°ü½«±»Ë͵½Ò»¸öÌØ¶¨µÄÖ÷»ú£ºÍø¹Ø¡£Íø¹Ø£¨»ò·ÓÉÆ÷£©ÊÇÓÃÀ´Á¬½Ó¶à¸öIP×ÓÍøµÄ£¬ËüÃÇ»áת·¢ËÍ´Ó×ÓÍøÄÚÀ´µÄIP°ü¡£ÀýÈ磬Èç¹û×ÓÍø16.42.1.0ºÍ16.42.0.0Ö®¼äͨ¹ýÒ»¸öÍø¹ØÏàÁ¬£¬ÄÇôÈκδÓ×ÓÍø0·¢Íù×ÓÍø1µÄ°ü±ØÐëÓÉÍø¹ØÖ¸Òý£¬Íø¹Ø¿ÉÒÔ°ïÕâЩ°üÕÒµ½ÕýÈ·µÄ·Ïß¡£±¾µØÖ÷»ú½¨Á¢Â·ÓɱíÓÃÒÔΪIP°üÕÒµ½ÕýÈ·µÄ»úÆ÷¡£Ã¿Ò»¸öÄ¿µÄIP¶¼ÓÐÒ»¸öÌõÄ¿ÔÚ·ÓɱíÖУ¬ÓÃÒÔ¸æËßLinux½«IP°üË͵½ÄÄһ̨Ö÷»ú¡£ÕâЩ·ÓɱíÊÇËæÍøÂçµÄÍØÆË½á¹¹±ä»¯¶ø¶¯Ì¬±ä»¯µÄ¡£


ͼ 10.1: TCP/IP ЭÒé²ã

    IPЭÒéÊÇÒ»¸ö´«Êä²ãµÄЭÒ飬ÆäËüЭÒé¿ÉÒÔÓÃËüÀ´´«ÊäÊý¾Ý¡£´«Êä¿ØÖÆÐ­Ò飨TCP£©ÊÇÒ»¸ö¿É¿¿µÄ¶Ë¶Ô¶ËµÄЭÒ飬ËüÓÃIPÀ´´«ËͺͽÓÊÕËü×Ô¼ºµÄ°ü¡£ÕýÈçIP°üÓÐËü×Ô¼ºµÄÍ·Ò»Ñù£¬TCPÒ²ÓÐËü×Ô¼ºµÄÍ·¡£TCPÊÇÒ»¸öÃæÏòÁ¬½ÓµÄЭÒ飬Á½¸öÍøÂçÓ¦ÓóÌÐòͨ¹ýÒ»¸öÐéÁ¬½ÓÏàÁ¬£¬¼´Ê¹ËüÃÇÖ®¼ä¿ÉÄܸôןܶà×ÓÍø¡¢Íø¹Ø¡¢Â·ÓÉÆ÷¡£TCP¿É¿¿µØ´«ËͺͽÓÊÕÁ½Ó¦ÓóÌÐò¼äµÄÊý¾Ý£¬²¢±£Ö¤Êý¾Ý²»»á¶ªÊ§¡£µ±ÓÃIPÀ´´«ÊäTCP°üʱ£¬IP°üµÄÊý¾Ý¶Î¾ÍÊÇTCP°ü¡£Ã¿Ò»¸öͨѶÖ÷»úµÄIP²ã¸ºÔð´«ËͺͽÓÊÕIP°ü¡£Óû§Êý¾Ý±¨Ð­Ò飨UDP£©Ò²ÓÃIP²ãÀ´´«ÊäËüµÄ°ü£¬²»ÏóTCP£¬UDP²»ÊÇÒ»¸ö¿É¿¿µÄЭÒ飬µ«ËüÌṩÁËÒ»ÖÖÊý¾Ý±¨·þÎñ¡£Óжà¸öЭÒé¿ÉÒÔʹÓÃIP²ã£¬½ÓÊÕIP°üµÄʱºò±ØÐèÖªµÀ¸ÃIP°üÖеÄÊý¾ÝÊÇÄĸöÉϲãЭÒéµÄ£¬Òò´ËIP°üÍ·ÖÐÓиöÒ»×Ö½Ú°üº¬×ÅЭÒé±êʶ·û¡£ÀýÈ磬µ±TCPÇëÇóIP²ã´«ÊäÒ»¸öIP°üʱ£¬IP°üµÄ°üÍ·ÖÐÓñêʶ·ûÖ¸Ã÷¸Ã°ü°üº¬Ò»¸öTCP°ü£¬IP½ÓÊÕ²ãÓøñêʶ·û¾ö¶¨ÓÉÄÄһЭÒéÀ´ ½ÓÊÕÊý¾Ý£¬Õâ¸öÀý×ÓÖÐÊÇTCP²ã¡£µ±Ó¦ÓóÌÐòͨ¹ýTCP/IP½øÐÐͨѶʱ£¬ËüÃDz»½öÒªÖ¸¶¨Ä¿±êµÄIPµØÖ·£¬¶øÇÒ»¹ ÒªÖ¸¶¨Ó¦ÓõĶ˿ڵØÖ·¡£Ò»¸ö¶Ë¿ÚµØÖ·Î¨Ò»µØ±êʶһ¸öÓ¦Ó㬱ê×¼µÄÍøÂçÓ¦ÓÃʹÓñê×¼µÄ¶Ë¿ÚµØÖ·£»È磬Web ·þÎñʹÓÃ80¶Ë¿Ú¡£ÕâЩÒѵǼǵĶ˿ڵØÖ·¿ÉÔÚ /etc/services Öп´µ½¡£

    ÕâÒ»²ãµÄЭÒé²»½ö½öÊÇTCP¡¢UDPºÍIP¡£IPЭÒé²ã±¾ÉíÓúܶàÖÖÎïÀíý½é½«IP°ü´ÓÒ»¸öÖ÷»ú´«µ½ÆäËüÖ÷»ú¡£ÕâЩý½é¿ÉÒÔ¼ÓÈëËüÃÇ×Ô¼ºµÄЭÒéÍ·¡£ÒÔÌ«Íø²ã¾ÍÊÇÒ»¸öÀý×Ó£¬µ«PPPºÍSLIP²»ÊÇÕâÑù¡£Ò»¸öÒÔÌ«ÍøÂçÔÊÐíºÜ¸öÖ÷»úͬʱÁ¬½Óµ½Í¬Ò»¸ùÎïÀíµçÀ¡£´«ÊäÖеÄÿһ¸öÒÔÌ«ÍøÖ¡¿ÉÒÔ±»ËùÓÐÖ÷»ú¿´¼û£¬Òò´ËÿһÒÔÌ«ÍøÉ豸ÓиöΨһµÄµØÖ·¡£Èκδ«Ë͸ø¸ÃµØÖ·µÄÒÔÌ«ÍøÖ¡±»ÓиõØÖ·µÄÒÔÌ«ÍøÉ豸½ÓÊÕ£¬¶øÆäËüÖ÷»úÔòºöÂÔ¸ÃÖ¡¡£Õâ¸öΨһµÄµØÖ·ÄÚÖÃÓÚÿһÒÔÌ«ÍøÉ豸ÖУ¬Í¨³£ÊÇÔÚÍø¿¨³ö³§Ê±¾ÍдÔÚSROM2ÖÐÁË¡£ÒÔÌ«ÍøµØÖ·ÓÐ6¸ö×Ö½Ú³¤£¬È磺 08-00-2b-00-49-A4 ¡£Ò»Ð©ÒÔÌ«ÍøµØÖ·ÊDZ£Áô¸ø¶àµã´«ËÍÓõģ¬ËÍÍùÕâЩµØÖ·µÄÒÔÌ«ÍøÖ¡½«±»ÍøÉÏËùÓеÄÖ÷»ú½ÓÊÕ¡£ÒÔÌ«ÍøÖ¡¿ÉÒÔЯ´øºÜ¶àÖÖЭÒ飨×÷ΪÊý¾Ý£©£¬ÈçIP°ü£¬²¢ÇÒÒ²°üÀ¨ËüÃÇÍ·ÖеÄЭÒé±êʶ·û¡£ÕâʹµÃÒÔÌ«Íø²ãÄÜÕýÈ·µØ½ÓÊÕIP°ü²¢½«ËüÃÇ´«¸øIP²ã¡£

    ÎªÁËÄÜͨ¹ýÏóÒÔÌ«ÍøÕâÑùµÄ¶àÁ¬½ÓЭÒé´«ËÍIP°ü£¬IP²ã±ØÐëÕÒµ½Ã¿Ò»IPÖ÷»úµÄÒÔÌ«ÍøµØÖ·¡£IPµØÖ·½ö½öÊÇÒ»¸öµØÖ·¸ÅÄÒÔÌ«ÍøÉ豸ÓÐËüÃÇ×ÔÉíµÄÎïÀíµØÖ·¡£´ÓÁíÒ»·½ÃæËµ£¬IPµØÖ·ÊÇ¿ÉÒÔ±»ÍøÂç¹ÜÀíÔ±¸ù¾ÝÐèÒªÀ´·ÖÅäºÍÔÙ·ÖÅäµÄ£¬¶øÍøÂçÓ²¼þÖ»¶Ôº¬ÓÐËüÃÇ×Ô¼ºµÄÎïÀíµØÖ·»ò¶àµã´«Ë͵ØÖ·µÄÒÔÌ«ÍøÖ¡×÷³öÏìÓ¦¡£LinuxÓõØÖ· ½âÎöЭÒ飨ARP£©À´ÔÊÐí»úÆ÷½«IPµØÖ·×ª±ä³ÉÕæÕýµÄÓ²¼þµØÖ·£¬ÈçÒÔÌ«ÍøµØÖ·¡£Èç¹ûÒ»¸öÖ÷»úÏëÖªµÀijһIPµØÖ·¶ÔÓ¦µÄÓ²¼þµØÖ·£¬Ëü¾ÍÓÃÒ»¸ö¶àµã´«Ë͵ØÖ·½«Ò»¸ö°üº¬Á˸ÃIPµØÖ·µÄARPÇëÇó°ü·¢¸øÍøÉÏËùÓнڵ㣬ӵÓиÃIPµØÖ·µÄµÄÄ¿±êÖ÷»úÔòÏìÓ¦Ò»¸ö°üº¬ÎïÀíÓ²¼þµØÖ·µÄARPÓ¦´ð¡£ARP²»½ö½ö¾ÖÏÞÓÚÒÔÌ«ÍøÉ豸£¬ËüÄܹ»ÓÃÀ´ÔÚÆäËüһЩÎïÀíý½éÉϽâÎöIPµØÖ·£¬ÈçFDDI¡£ÄÇЩ²»Ö§³ÖARPµÄÍøÂçÉ豸»á±»±ê¼Ç³öÀ´£¬Linux½«²»»áÓÃARP¡£»¹ÓÐÒ»¸öÌṩÏà·´¹¦Äܵķ´ÏòµØÖ·½âÎöЭÒ飨RARP£©£¬ÓÃÀ´½«ÎïÀíÍøÂçµØÖ·×ª±äΪIPµØÖ·¡£ÕâһЭÒé³£³£±»Íø¹ØÓÃÀ´ÏìÓ¦°üº¬Ô¶³ÌÍøÂçIPµØÖ·µÄARPÇëÇó¡£

10.2  Linux TCP/IP ÍøÂç²ã


ͼ 10.2: Linux ÍøÂç²ã

    ÕýÈçÍøÂçЭÒé±¾Éí£¬Í¼ 10.2 ÏÔʾ³öLinuxÓÃһϵÁÐÏ໥Á¬½Ó²ãµÄÈí¼þʵÏÖInternetЭÒ鵨ַ×å¡£BSDÌ×½Ó×Ö£¨BSD sockets£©ÓÉרÃÅ´¦ÀíBSD socketsͨÓÃÌ×½Ó×Ö¹ÜÀíÈí¼þ´¦Àí¡£ËüÓÉINET sockets²ãÀ´Ö§³Ö£¬ÕâÒ»²ãΪ»ùÓÚIPµÄЭÒéTCPºÍUDP¹ÜÀí´«Êä¶Ëµã¡£UDP£¨Óû§Êý¾Ý±¨Ð­Ò飩ÊÇÒ»¸öÎÞÁ¬½ÓЭÒé¶øTCP£¨´«Êä¿ØÖÆÐ­Ò飩ÊǸö¿É¿¿µÄ¶Ë¶Ô¶ËЭÒé¡£´«ÊäUDP°üʱ£¬Linux²»ÖªµÀÒ²²»¹ØÐÄÊÇ·ñËüÃǰ²È«µ½´ïÄ¿µÄµØ¡£TCP°üÔò±»TCPÁ¬½ÓÁ½¶Ë±àºÅÒÔ±£Ö¤´«ÊäµÄÊý¾Ý±»ÕýÈ·½ÓÊÕ¡£IP²ã°üº¬ÁËʵÏÖInternetЭÒéµÄ´úÂë¡£ÕâЩ´úÂë¸øÒª´«ÊäµÄÊý¾Ý¼ÓÉÏIPÍ·£¬²¢ÖªµÀÈçºÎ°Ñ´«ÈëµÄIP°üË͸øTCP»òUDP¡£ÔÚIP²ãÒÔÏ£¬ÊÇÍøÂçÉ豸À´Ö§³ÖËùÓÐLinuxÍøÂ繤×÷£¬ÈçPPPºÍÒÔÌ«Íø¡£ÍøÂçÉ豸²»×ÜÊÇÎïÀíÉ豸£»Ò»Ð©ÏóloopbackÕâÑùµÄÉ豸ÊÇ´¿Èí¼þÉ豸¡£±ê×¼µÄLinuxÉ豸ÓÃmknodÃüÁÁ¢£¬ÍøÂçÉ豸ҪÓõײãÈí¼þ·¢ÏÖ²¢³õʼ»¯Ëü¡£½¨Á¢Ò»¸öÓÐÊʵ±µÄÒÔÌ«ÍøÉ豸Çý¶¯ÔÚÄÚµÄÄں˺ó£¬Äã¾Í¿ÉÒÔ¿´µ½ /dev/eth0 ¡£ARPЭÒéλÓÚIP²ãÓëÖ§³ÖARPµÄЭÒéÖ®¼ä¡£

10.3  BSD Socket ½Ó¿Ú

    ÕâÊÇÒ»¸öͨÓõĽӿڣ¬Ëü²»½öÖ§³Ö¸÷ÖÖÍøÂ繤×÷ÐÎʽ£¬¶øÇÒ»¹ÊÇÒ»¸ö½»»¥Ê½Í¨Ñ¶»úÖÆ¡£Ò»¸öÌ×½Ó×ÖÃèÊöÒ»¸öͨѶÁ¬½ÓµÄÒ»¶Ë£¬Á½¸öͨѶ³ÌÐòÖи÷×ÔÓÐÒ»¸öÌ×½Ó×ÖÀ´ÃèÊöËüÃÇ×Ô¼ºÄÇÒ»¶Ë¡£Ì×½Ó×Ö¿ÉÒÔ±»¿´³ÉÒ»¸öרÃŵĹܵÀ£¬µ«ÓÖ²»Ïó¹ÜµÀ£¬Ì×½Ó×Ö¶ÔËüÃÇÄÜÈÝÄɵÄÊý¾ÝÁ¿Ã»ÓÐÏÞÖÆ¡£LinuxÖ§³Ö¶àÖÖÀàÐ͵ÄÌ×½Ó×Ö¡£ÕâÊÇÒòΪÿһÀàÐ͵ÄÌ×½Ó×ÖÓÐËü×Ô¼ºµÄͨÐÅѰַ·½·¨¡£LinuxÖ§³ÖÏÂÁÐÌ×½Ó×ÖµØÖ·×å»òÓò£º

 
UNIX Unix ÓòÌ×½Ó×Ö
INET InternetµØÖ·×åÖ§³Öͨ¹ýTCP/IPЭÒéµÄͨÐÅ
AX25 Amateur radio X25
IPX Novell IPX
APPLETALK Appletalk DDP
X25 X25

    ÓÐһЩÌ×½Ó×ÖÀàÐÍÖ§³ÖÃæÏòÁ¬½ÓµÄ·þÎñÀàÐÍ¡£²¢·ÇËùÓеĵØÖ·×åÄÜÖ§³ÖËùÓеķþÎñÀàÐÍ¡£Linux BSD Ì×½Ó×ÖÖ§³ÖÏÂÁÐÌ×½Ó×ÖÀàÐÍ£º

Stream
ÕâЩÌ×½Ó×ÖÌṩ¿É¿¿µÄË«¹¤Ë³ÐòÊý¾ÝÁ÷£¬Äܱ£Ö¤´«Ë͹ý³ÌÖÐÊý¾Ý²»¶ªÊ§£¬²»±»Åª»ìºÍ¸´ÖÆ¡£InternetµØÖ·ÖеÄTCPЭÒéÖ§³ÖÁ÷Ì×½Ó×Ö¡£
Datagram
ÕâЩÌ×½Ó×ÖÌṩ˫¹¤Êý¾Ý´«ËÍ£¬µ«ÓëÁ÷Ì×½Ó×Ö²»Í¬£¬ÕâÀï²»±£Ö¤ÐÅÏ¢µÄµ½´ï¡£¼´Ê¹ËüÃǵ½´ïÁË£¬Ò²²»Äܱ£Æäµ½´ïµÄ˳Ðò£¬ÉõÖÁ²»Äܱ£Ö¤±»¸´ÖƺÍŪ»ì¡£ÕâÀàÌ×½Ó×ÖÓÉInternetµØÖ·×åÖеÄUDPЭÒéÖ§³Ö¡£
Raw
ÔÊÐíÖ±½Ó´¦ÀíϲãЭÒé(ËùÒԽС°Raw¡±)¡£ÀýÈ磬ÓпÉÄÜ´ò¿ªÒ»¸örawÌ×½Ó×Öµ½ÒÔÌ«ÍøÉ豸£¬¿´ raw IPÊý¾Ý´«Êä¡£
Reliable Delivered Messages
ÓëÊý¾Ý±¨ºÜÏ󣬵«ËüÄܱ£Ö¤Êý¾ÝµÄµ½´ï¡£
Sequenced Packets
ÓëÁ÷Ì×½Ó×ÖÏàËÆ£¬µ«µÄÊý¾Ý°ü´óСÊǹ̶¨µÄ¡£
Packet
Õâ²»ÊÇÒ»¸ö±ê×¼µÄBSDÌ×½Ó×ÖÀàÐÍ£¬¶øÊÇÒ»¸öLinuxÌØ¶¨µÄÀ©Õ¹£¬ËüÔÊÐíÔÚÉ豸¼¶ÉÏÖ±½Ó´¦Àí°ü¡£

    ¿Í»§·þÎñÆ÷ģʽÏÂʹÓÃÌ×½Ó×Ö½øÐÐͨÐÅ¡£·þÎñÆ÷ÌṩһÖÖ·þÎñ£¬¿Í»§Ê¹ÓÃÕâÖÖ·þÎñ¡£Web·þÎñÆ÷¾ÍÊÇÒ»¸öÀý×Ó£¬ËüÌá¹©ÍøÒ³£¬¶ø¿Í»§¶Ë£¬»òÕß˵ä¯ÀÀÆ÷£¬À´¶ÁÕâÐ©ÍøÒ³¡£·þÎñÆ÷ҪʹÓÃÌ×½Ó×Ö£¬Ê×ÏÈÒª½¨Á¢Ì×½Ó×Ö²¢½«ËüÓëÒ»¸öÃû³Æ°ó¶¨¡£Ãû³ÆµÄ¸ñʽÓÉÌ×½Ó×ֵĵØÖ·×åÀ´¶¨£¬ÊÇ·þÎñÆ÷µÄ±¾µØÓÐЧµØÖ·¡£Ì×½Ó×ÖµÄÃû³Æ»òµØÖ·ÓýṹsockaddrÀ´Ö¸¶¨¡£Ò»¸öINETÌ×½Ó×Ö»¹ÓëÒ»¸ö¶Ë¿ÚµØÖ·°ó¶¨¡£ÒÑ×¢²áµÄ¶Ë¿ÚºÅ¿ÉÔÚ /etc/services ÖÐÕÒµ½£»ÀýÈ磬Web·þÎñµÄ¶Ë¿ÚºÅÊÇ80¡£½«Ì×½Ó×ÖÓëµØÖ·°ó¶¨ÒԺ󣬷þÎñÆ÷²»¿ÉÒÔ¼àÌýÖ¸¶¨µÄ°ó¶¨Á˵ĵØÖ·ÉϵÄÒýÈëÁ¬½ÓÇëÇó¡£ÇëÇóµÄ·¢ÆðÕߣ¬¿Í»§¶Ë£¬½¨Á¢Ò»¸öÌ×½Ó×Ö²¢Í¨¹ýËüÀ´·¢³öÒ»¸öÁ¬½ÓÇëÇóµ½Ö¸¶¨µÄÄ¿±ê·þÎñÆ÷µØÖ·¡£¶ÔÓÚÒ»¸öINETÌ×½Ó×Ö£¬·þÎñÆ÷µØÖ·ÊÇËüµÄIPµØÖ·ºÍËüµÄ¶Ë¿ÚºÅ¡£ÕâЩÒýÈëÇëÇó±ØÐëͨ¹ý¸÷ÖÖЭÒé²ãÕÒµ½Ä¿µÄµØÖ·£¬È»ºóµÈ´ý·þÎñÆ÷µÄ¼àÌýÌ×½Ó×Ö¡£·þÎñÆ÷ÊÕµ½ÒýÈëÇëÇóºó¿ÉÒÔ½ÓÊÕ»ò¾Ü¾øËü¡£Èç¹û¾ö¶¨½ÓÊÕ£¬·þÎñÆ÷±ØÐ轨Á¢Ò»¸öÐÂÒ»Ì×½Ó×ÖÀ´½ÓÊÕÇëÇó¡£µ±Ò»¸öÌ×½Ó×Ö±»ÓÃÀ´¼àÌýÒýÈëÁ¬½ÓÇëÇóʱ£¬Ëü¾Í²»ÄÜÓÃÀ´Ö§³ÖÁ¬½ÓÁË¡£Á¬½Ó½¨Á¢ºóÁ½¶Ë¾Í¿ÉÒÔ×ÔÓɵط¢ËͺͽÓÊÕÊý¾ÝÁË¡£×îºó£¬µ±²»ÔÙÐèÒªÁ¬½Óʱ£¬¾Í½«Ö®¹Ø±Õ¡£Òª×¢Òâ±£Ö¤ÔÚ´«Êä¹ý³ÌÕýÈ·´¦ÀíÊý¾Ý°ü¡£

    ¶ÔBSD socket½øÐÐ׼ȷ²Ù×÷ÒªÒÀÀµÓÚËüÏÂÃæµÄµØÖ·×å¡£ÉèÖÃTCP/IPÁ¬½ÓÓëÉèÖÃamateur radio X.25Á¬½ÓÓкܴó²»Í¬¡£ÏóÐéÄâÎļþϵͳһÑù£¬Linux´ÓBSD socket²ã³éÏó³ösocket½Ó¿Ú£¬Ó¦ÓóÌÐòºÍBSD socketÓÉÿ¸öµØÖ·×åµÄÌØ¶¨Èí¼þÀ´Ö§³Ö¡£Äں˳õʼ»¯Ê±£¬µØÖ·×å±»ÖÃÈëÄÚºËÖв¢½«×Ô¼º×¢²áµ½BSD socket½Ó¿Ú¡£Ö®ºó£¬µ±Ó¦ÓóÌÐò½¨Á¢ÓÃʹÓÃBDS socketsʱ£¬ÔÚBSD socketÓëËüÖ§³ÖµÄµØÖ·×åÖ®¼ä½«²úÉúÒ»¸öÁª½Ó¡£ÕâÒ»Áª½ÓÊÇÓɽ»²æÁ´½ÓÊý¾Ý½á¹¹ºÍµØÖ·×å±íÌØ¶¨Ö§³Ö³ÌÐò²úÉú¡£ÀýÈ磬ÿµ±Ó¦ÓóÌÐò½¨Á¢Ò»¸öеÄsocket£¬¾Í»áÓÐÒ»¸öBSD socket½Ó¿ÚÓõĵØÖ·×åÌØ¶¨ socket½¨Á¢³ÌÐò¡£

    ¹¹ÔìÄÚºËʱ£¬Ò»Ð©µØÖ·×åºÍЭÒé±»ÖÃÈë protocols ÏòÁ¿¡£Ã¿¸öÓÉËüµÄÃû³ÆÀ´±íÕ÷£¬ÀýÈ磬¡°INET¡±ºÍËüµÄ³õʼ³ÌÐòµØÖ·¡£µ±Ì×½Ó¿ÚÆô¶¯Ê±±»³õʼ»¯Ê±£¬Òªµ÷ÓÃÿһЭÒéºÍ³õʼ³ÌÐò¡£¶ÔsocketµØÖ·×åÀ´Ëµ£¬Õâ»áµ¼ÖÂËüÃÇ×¢²áÒ»Ì×ЭÒé²Ù×÷¡£ÕâÊÇÒ»Ì×Àý³Ì£¬ÆäÖеÄÿһÀý³ÌÖ´ÐÐÒ»¸öÌØ¶¨µÄÕë¶ÔÄÇÒ»µØÖ·×åµÄ²Ù×÷¡£ÒÑ×¢²áµÄЭÒé²Ù×÷±»´æÔÚ pops ÏòÁ¿£¬Ò»¸öÖ¸Ïò proto_ops Êý¾Ý½á¹¹µÄÏòÁ¿ÖС£

    proto_ops ½á¹¹ÓɵØÖ·×åÀàÐͺÍһϵÁÐÖ¸ÏòÓëÌØ¶¨µØÖ·×å¶ÔÓ¦µÄsocket²Ù×÷Àý³ÌµÄÖ¸Õë×é³É¡£pops ÏòÁ¿Í¨¹ýµØÖ·×å±êʶ·ûÀ´Ë÷Òý£¬ÈçInternetµØÖ·×å±êʶ·û£¨AF_INETÊÇ2£©¡£


ͼ 10.3: Linux BSD Socket Êý¾Ý½á¹¹

10.4  INET Socket ²ã

    INET socket²ãÖ§³Ö°üÀ¨TCP/IPЭÒéÔÚÄÚµÄinternetµØÖ·×å¡£ÈçǰËùÊö£¬ÕâЩЭÒéÊÇ·Ö²ãµÄ£¬Ò»¸öЭÒéʹÓÃÁíÒ»¸öЭÒéµÄ·þÎñ¡£LinuxµÄTCP/IP´úÂëºÍÊý¾Ý½á¹¹·´Ó³ÁËÕâÒ»·Ö²ãÄ£ÐÍ¡£ËüÓëBSD socket²ãµÄ½Ó¿ÚҪͨ¹ýһϵÁÐInternetµØÖ·×åsocket²Ù×÷£¬ÕâÒ»²Ù×÷ÊÇÔÚÍøÂç³õʼ»¯Ê±¾ÍÒѾ­×¢²áµ½BSD socket²ãµÄ¡£ÕâЩ¶¼ÓëÆäËüÒÑ×¢²áµÄµØÖ·×åÒ»Æð±£´æÔÚ pops ÏòÁ¿ÖС£BSD socket²ã´ÓÒÑ×¢²áµÄINET proto_ops Êý¾Ý½á¹¹Öе÷ÓÃINET²ã socketÖ§³ÖÀý³ÌÀ´ÎªËüÖ´Ðй¤×÷¡£ÀýÈ磬һ¸öµØÖ·×åΪINETµÄBSD socket½¨Á¢ÇëÇ󣬽«Óõ½Ï²ãµÄINET socketµÄ½¨Á¢º¯Êý¡£ÔÚÕâЩ²Ù×÷ÖУ¬BSD socket²ã°ÑÓÃÀ´ÃèÊöBSD socketµÄ socket ½á¹¹´«¹¹µ½INET²ã¡£ÎªÁ˲»°ÑBSD socket ÓëTCP/IPµÄÌØ¶¨ÐÅÏ¢¸ã»ì£¬INET socket²ãʹÓÃËü×Ô¼ºµÄÊý¾Ý½á¹¹£¬sock £¬ËüÓëBSD socket ½á¹¹ÏàÁ¬¡£ÕâÒ»Áª½Ó¹ØÏµ¿ÉÒÔ´Óͼ  10.3 Öп´³ö¡£ËüÓÃBSD socketµÄ data Ö¸ÕëÀ´Á¬½Ó sock ½á¹¹ÓëBSD socket½á¹¹¡£ÕâÒâζןóÀ´µÄINET socketµ÷ÓÃÄܹ»ºÜÈÝÒ×µØÖØÐÂÕÒµ½ sock ½á¹¹¡£ sock ½á¹¹µÄЭÒé²Ù×÷Ö¸ÕëÒ²ÔÚ³õʼ»¯Ê±½¨Á¢£¬ËüÒÀÀµÓë±»ÇëÇóµÄЭÒé¡£Èç¹ûÇëÇóµÄÊÇTCP£¬ÄÇô sock ½á¹¹µÄЭÒé²Ù×÷Ö¸Õ뽫ָÏòTCPÁ¬½ÓËù±ØÐèµÄTCPЭÒé²Ù×÷¼¯¡£

10.4.1  ½¨Á¢BSD socket

    ÏµÍ³½¨Á¢Ò»¸öеÄsocketʱ£¬Í¨¹ý±êʶ·ûÀ´È·¶¨ËüµÄµØÖ·×壬socketÀàÐͺÍЭÒé¡£

    Ê×ÏÈ£¬´Ó pops ÏòÁ¿ÖÐËÑË÷Óë±»ÇëÇóµÄµØÖ·×åÏàÆ¥ÅäµÄµØÖ·×å¡£Ëü¿ÉÄÜÊÇÒ»¸ö×÷ΪºËÐÄÄ£¿éÀ´ÊµÏÖµÄÒ»¸öÌØ¶¨µÄµØÖ·×壬ÕâÑù£¬ÔÚÆäÄܼÌÐø¹¤×÷ǰ£¬ kerneld ÊØ»¤½ø³Ì±ØÐë¼ÓÔØÕâһģ¿é¡£·ÖÅäÒ»¸öÐ嵀 socket ½á¹¹À´´ú±íBSD socket¡£Êµ¼ÊÉÏ socket ½á¹¹ÊÇ VFS inode ½á¹¹µÄÒ»²¿·Ö£¬·ÖÅäÒ»¸ösocketʵ¼ÊÉϾÍÊÇ·ÖÅäÒ»¸ö VFS inode ¡£³ý·ÇÄãÈÏΪsocket²Ù×÷ÄÜºÍÆÕͨµÄÎļþ²Ù×÷Ò»Ñù£¬·ñÔò»á¾õµÃÕâºÃÏóºÜÆæ¹Ö¡£ËùÓеÄÎļþÓÃVFS inode½á¹¹À´±íʾ£¬ÎªÁËÖ§³ÖÎļþ²Ù×÷£¬BSD socket±ØÐëÒ²Óà VFS inode À´±íʾ¡£

    ×îн¨Á¢µÄ BSD socket ½á¹¹°üº¬Ò»¸öÖ¸ÏòµØÖ·×åÌØ¶¨socketÀý³ÌµÄÖ¸Õ룬¿ÉÒÔÓÃÀ´´Ó pops ÏòÁ¿ÖÐÕÒµ½ proto_ops ½á¹¹¡£ËüµÄÀàÐͱ»ÉèÖóɱ»ÇëÇóµÄsocketÀàÐÍ£ºSOCK_STREAM£¬SOCK_DGRAMµÈµÈÖ®Ò»¡£µ÷ÓõØÖ·×åÌØ¶¨´´½¨Àý³ÌʹÓñ£´æÔÚ proto_ops ½á¹¹ÖеĵØÖ·¡£

    ´Óµ±Ç°¹ý³Ì fd ÏòÁ¿ÖзÖÅäÒ»¸ö×ÔÓɵÄÎļþÃèÊö·û£¬¶Ô file ½á¹¹ËùÖ¸ÏòµÄ½øÐгõʼ»¯¡£°üÀ¨½«Îļþ²Ù×÷Ö¸ÕëÉèÖÃΪָÏòÓÉBSD socket½Ó¿ÚÖ§³ÖµÄBSD socketÎļþ²Ù×÷¼¯¡£ÈκβÙ×÷½«±»Òýµ½socket½Ó¿Ú£¬Í¨¹ýµ÷ÓÃËüµÄµØÖ·×å²Ù×÷Àý³Ì½«ËüÃÇ´«µ½Ö§³ÖµÄµØÖ·×å¡£

10.4.2  ½«µØÖ·ÓëINET BSD socket°ó¶¨

    ÎªÁËÄܼàÌýÊäÈëµÄinternetÁ¬½ÓÇëÇó£¬Ã¿¸ö·þÎñÆ÷±ØÐ뽨Á¢Ò»¸öINET BSD socket£¬²¢½«µØÖ·ÓëÆä°ó¶¨¡£°ó¶¨²Ù×÷Ö÷ÒªÔÚINET socket²ãÄÚ´¦Àí£¬ÏÂÃæµÄTCPºÍUDPЭÒé²ãÌṩһЩ֧³Ö¡£ÓëÒ»¸öµØÖ·°ó¶¨Á˵Äsocket²»ÄÜÓÃÀ´½øÐÐÈÎºÎÆäËüµÄͨѶ¹¤×÷£¬Ò²¾ÍÊÇ˵£ºsocketµÄ״̬±ØÐëÊÇ TCP_CLOSE ¡£ sockaddr ½á¹¹°üº¬ÁËÓëÒ»¸öÈÎÒâµÄ¶Ë¿ÚºÅ°ó¶¨µÄIPµØÖ·¡£Í¨³£°ó¶¨µÄIPµØÖ·ÒѾ­·ÖÅ䏸ÁËÒ»¸öÍøÂçÉ豸£¬¸ÃÉ豸֧³ÖINETµØÖ·×åÇÒÆä½Ó¿ÚÊÇ¿ÉÓõġ£¿ÉÒÔÔÚϵͳÖÐÓÃifconfigÃüÁîÀ´²é¿´ÄÄÒ»¸öÍøÂç½Ó¿ÚÊǵ±Ç°¼¤»îµÄ¡£IPµØÖ·Ò²¿ÉÒÔÊǹ㲥µØÖ·£¬È«1»òÈ«0¡£ÕâÊÇÐ©ÌØ¶¨µÄµØÖ·£¬ÓÃÒÔ±íʾ·¢Ë͸øÈκÎÈË3¡£Èç¹û»úÆ÷³äµ±Ò»¸ö͸Ã÷µÄ´úÀí»ò·À»ðǽ£¬ÔòIPµØÖ·¿É±»Ö¸¶¨ÎªÈÎÒ»¸öIPµØÖ·£¬µ«Ö»ÓÐÓг¬¼¶Óû§È¨Ï޵Ľø³ÌÄܰ󶨵½ÈκÎÒ»¸öIPµØÖ·¡£°ó¶¨µÄIPµØÖ·±»´æÔÚsock½á¹¹ÖÐµÄ recv_addr ºÍ saddr ×ֶΡ£¶Ë¿ÚºÅÊÇ¿ÉÑ¡µÄ£¬Èç¹ûûÓÐÖ¸¶¨£¬½«ÈÎÒâÖ¸¶¨Ò»¸ö¡£°´¹ßÀý£¬Ð¡ÓÚ1024µÄ¶Ë¿ÚºÅ²»Äܱ»Ã»Óг¬¼¶Óû§È¨Ï޵Ľø³ÌʹÓá£Èç¹ûϲãÍøÂçûÓзÖÅä¶Ë¿ÚºÅ£¬Ôò·ÖÅäÒ»¸ö´óÓÚ1024µÄ¶Ë¿ÚºÅ¡£

    Ï²ãÍøÂçÉ豸½ÓÊյİü±ØÐëÓɾ­ÕýÈ·µÄINETºÍBSD socket²ÅÄܱ»´¦Àí¡£Òò´Ë£¬UDPºÍTCPά»¤ÁËһЩhash±íÓÃÀ´ÔÚÊäÈëIPÏûÏ¢ÄÚ²éÕÒµØÖ·²¢½«ËüÃǵ¼ÏòÕýÈ·µÄ socket/sock ¶Ô¡£TCPÊÇÒ»¸öÃæÏòÁ¬½ÓµÄЭÒ飬Òò¶øÉæ¼°´¦ÀíTCP°üµÄÐÅÏ¢±ÈÓÃÓÚ´¦ÀíUDP°üµÄÐÅÏ¢¶à¡£

UDPά»¤×ÅÒ»ÕÅÒÑ·ÖÅäUDP¶Ë¿Ú±í£¬ udp_hash ±í¡£ÓÉÖ¸Ïò sock Êý¾Ý½á¹¹µÄÖ¸Õë×é³É£¬Í¨¹ýÒ»¸ö»ùÓڶ˿ںŵÄhashº¯ÊýÀ´Ë÷Òý¡£UDPhash±í±ÈÔÊÐíµÄ¶Ë¿ÚºÅµÄÊýĿСµÃ¶à£¨udp_hash Ϊ128 »òÕß˵ÊÇ UDP_HTABLE_SIZE £©±íÖеÄһЩÏîÖ¸ÏòÒ»¸ö sock ½á¹¹Á´£¬¸ÃÁ´ÓÃÿ¸ö sock ½á¹¹ÖÐµÄ next Ö¸ÕëÀ´½«Ã¿¸ö sock Á¬½ÓÆðÀ´¡£

    TCPÊÇÊ®·Ö¸´Ôӵģ¬Ëü°üÀ¨¼¸¸öhash±í¡£µ«Êµ¼ÊÉÏTCPÔڰ󶨲Ù×÷ʱûÓн« sock ½á¹¹ÓëÆähash±í°ó¶¨£¬Ëü½ö½ö¼ì²é±»ÇëÇóµÄ¶Ë¿ÚºÅµ±Ç°Ã»±»Ê¹Óᣠsock ½á¹¹ÊÇÔÚ listen ²Ù×÷ʱ±»¼ÓÈëTCPµÄhash±íµÄ¡£

¸´Ï°ÌáÒª: What about the route entered?

10.4.3  ÔÚINET BSD SocketÉϽ¨Á¢Á¬½Ó

    ½¨Á¢Ò»¸ösocket£¬Èç¹ûûÓÐÓÃËüÀ´¼àÌýÁ¬ÈëÇëÇó£¬ÄÇô¾ÍÄÜÓÃËüÀ´·¢Á¬³öÇëÇó¡£¶ÔÓÚÃæÏòÎÞÁ¬½ÓµÄЭÒéÈçUDPÀ´Ëµ£¬ÕâÒ»socket²Ù×÷²¢²»×öÐí¶àÊ£¬µ«¶ÔÓÚÃæÏòÁ¬½ÓµÄЭÒéÈçTCPÀ´Ëµ£¬ÕâÒ»²Ù×÷°üÀ¨ÁËÔÚÁ½¸öÓ¦Óü佨Á¢Ò»¸öÐéÁ¬½Ó¡£

    Ò»¸öÁ¬³öÁ¬½Ó²Ù×÷Ö»ÄÜÓÉÒ»¸öÔÚÕýȷ״̬ϵÄINET BSD socketÀ´Íê³É£»»»¾ä»°Ëµ£¬socket²»ÄÜÊÇÒѽ¨Á¢Á¬½ÓµÄ£¬²¢ÇÒÓб»ÓÃÀ´¼àÌýÁ¬ÈëÁ¬½Ó¡£ÕâÒâζ×ÅBSD socket ½á¹¹±ØÐëÊÇ SS_UNCONNECTED ״̬¡£UDPЭÒéûÓÐÔÚÁ½¸öÓ¦Óü佨Á¢ÐéÁ¬½Ó£¬Èκη¢³öµÄÏû Ï¢¶¼ÊÇÊý¾Ý±¨£¬ÕâЩÏûÏ¢¿ÉÄܵ½´ïÒ²¿ÉÄܲ»µ½´ïÄ¿µÄµØ¡£µ«Ëü²»Ö§³ÖBSD socketµÄ connect ²Ù×÷¡£½¨Á¢ÔÚUDPµÄINET BSD socketÉϵÄÁ¬½Ó²Ù×÷¼òµ¥µØÉèÖÃÔ¶³ÌÓ¦ÓõĵØÖ·£ºIPµØÖ·ºÍIP¶Ë¿ÚºÅ¡£ÁíÍ⣬Ëü»¹ÉèÖ÷ÓɱíÈë¿ÚµÄcacheÒÔ±ãÕâÒ»BSD socketÔÚ·¢ÓÃUDP°üʱ²»ÓÃÔٴβéѯ·ÓÉÊý¾Ý¿â£¨³ý·ÇÕâһ·ÓÉÒѾ­ÎÞЧ£©¡£INET sock ½á¹¹ÖÐµÄ ip_route_cache Ö¸ÕëÖ¸Ïò·ÓÉ»º´æÐÅÏ¢¡£Èç¹ûûÓиø³öµØÖ·ÐÅÏ¢£¬»º´æµÄ·ÓɺÍIPµØÖ·ÐÅÏ¢½«×Ô¶¯µØ±»ÓÃÀ´·¢ËÍÏûÏ¢¡£UDP½« sock µÄ״̬¸ÄΪ TCP_ESTABLISHED ¡£

¶ÔÓÚ»ùÓÚTCP BSD socketµÄÁ¬½Ó²Ù×÷£¬TCP±ØÐ뽨Á¢Ò»¸ö°üÀ¨Á¬½ÓÐÅÏ¢µÄTCPÏûÏ¢£¬²¢½«ËüË͵½Ä¿µÄIP¡£TCPÏûÏ¢°üº¬ÓëÁ¬½ÓÓйصÄÐÅÏ¢£¬Ò»¸öΨһ±êʶµÄÏûÏ¢¿ªÊ¼Ë³ÐòºÅ£¬Í¨¹ý³õʼ»¯Ö÷»úÀ´¹ÜÀíµÄÏûÏ¢´óСµÄ×î´óÖµ£¬¼°·¢ËÍÓë½ÓÊÕ´°¿Ú´óСµÈµÈ¡£ÔÚTCPÄÚ£¬ËùÓеÄÏûÏ¢¶¼ÊDZàºÅµÄ£¬³õʼµÄ˳ÐòºÅ±»ÓÃÀ´×÷ΪµÚÒ»ÏûÏ¢ºÅ¡£LinuxÑ¡ÓÃÒ»¸öºÏÀíµÄËæ»úÖµÀ´±ÜÃâ¶ñÒâЭÒé³åÍ»¡£Ã¿Ò»´ÓTCPÁ¬½ÓµÄÒ»¶Ë³É¹¦µØ´«µ½ÁíÒ»¶ËµÄÏûϢҪȷÈÏÆäÒѾ­ÕýÈ·µ½´ï¡£Î´È·ÈϵÄÏûÏ¢½«±»ÖØ´«¡£·¢ËÍÓë½ÓÊÕ´°¿ÚµÄ´óСÊǵÚÒ»¸öÈ·Èϵ½´ï֮ǰÏûÏ¢µÄ¸öÊý¡£ÏûÏ¢³ß´çµÄ×î´óÖµÓëÍøÂçÉ豸Óйأ¬ËüÃÇÔÚ³õʼ»¯ÇëÇóµÄ×îºóʱ¿ÌÈ·¶¨ÏÂÀ´¡£Èç¹û½ÓÊն˵ÄÍøÂçÉ豸µÄÏûÏ¢³ß´ç×î´óÖµ¸üС£¬ÔòÁ¬½Ó½«ÒÔСµÄÒ»¶ËΪ׼¡£Ó¦ÓóÌÐò·¢³öÁ¬½ÓÇëÇóºó±ØÐëµÈ´ýÄ¿±êÓ¦ÓóÌÐòµÄ½ÓÊÜ»ò¾Ü¾øÁ¬½ÓµÄÏìÓ¦¡£TCP sock ÆÚÍû×ÅÒ»¸öÊäÈëÏûÏ¢£¬Ëü±»¼ÓÈë tcp_listening_hash ÒÔ±ãÊäÈëTCPÏûÏ¢Äܱ»Ö¸ÏòÕâÒ» sock ½á¹¹¡£TCPͬʱҲ¿ªÊ¼¼ÆÊ±£¬µ±Ä¿±êÓ¦ÓÃûÓÐÏìÓ¦ÇëÇó£¬ÔòÁ¬³öÁ¬½ÓÇëÇó³¬Ê±¡£

10.4.4  ¼àÌý INET BSD Socket

    socketÓëµØÖ·°ó¶¨ºó£¬ÄܼàÌýÖ¸¶¨µØÖ·µÄÁ¬ÈëÁ¬½ÓÇëÇó¡£Ò»¸öÍøÂçÓ¦ÓóÌÐòÄܼàÌýsocket¶ø²»ÓÃÏȽ«µØÖ· ÓëÖ®°ó¶¨£»ÔÚÕâ¸öÀý×ÓÖУ¬INET socket²ãÕÒµ½Ò»¸öδÓõĶ˿ںţ¨¶ÔÕâһЭÒ飩²¢×Ô¶¯½«ËüÓësocket°ó¶¨¡£ ¼àÌýsocketº¯Êý½«socket״̬Éè³É TCP_LISTEN £¬²¢×öÆäËüÁ¬ÈëÁ¬½ÓËùÐèÒªµÄ¹¤×÷¡£

    ¶ÔÓÚUDP sockets£¬¸Ä±äsocketµÄ״̬¾Í×ã¹»ÁË£¬¶øTCPÏÖÔÚ¼ÓÁËsocketµÄ sock Êý¾Ý½á¹¹µ½Á½¸öhash±íÖв¢¼¤»î£¬ tcp_bound_hash ±íºÍ tcp_listening_hash ±í¡£ÕâÁ½¸ö±í¶¼Í¨¹ýÒ»¸ö»ùÓÚIP¶Ë¿ÚºÅµÄhashº¯ÊýÀ´Ë÷Òý¡£

    ÎÞÂÛºÎʱ£¬Ò»¸ö¼¤»îµÄ¼àÌýsocket½ÓÊÕÒ»¸öÁ¬ÈëµÄTCPÁ¬½ÓÇëÇó£¬TCP¶¼Òª½¨Á¢Ò»¸öÐ嵀 sock ½á¹¹À´ÃèÊöËü¡£×îÖÕ½ÓÊÕʱ£¬Õâ¸ö sock ½á¹¹½«³ÉΪTCPÁ¬½ÓµÄµ×²ã¡£ËüÒ²¸´Öưüº¬Á¬½ÓÇëÇóµÄ sk_buff £¬²¢½«Ëü·Åµ½¼àÌý sock ½á¹¹µÄ receive_queue ÖÐÅŶӡ£¸´ÖÆµÄ sk_buff °üº¬Ò»¸öÖ¸Ïòн¨Á¢µÄ sock ½á¹¹µÄÖ¸Õë¡£

10.4.5  ½ÓÊÕÁ¬½ÓÇëÇó

    UDP²»Ö§³ÖÁ¬½ÓµÄ¸ÅÄ½ÓÊÕINET socketÁ¬½ÓÇëÇóÖ»ÊÊÓÃÓÚTCPЭÒ飬һ¸ö¼àÌýsocket½ÓÊÕ²Ù×÷´ÓԭʼµÄ¼àÌýsocketÖи´ÖÆÐµÄsocket½á¹¹¡£½ÓÊÕ²Ù×÷͸¹ýÖ§³ÖµÄЭÒé²ã£¬±¾ÀýÊÇINET£¬À´½ÓÊÕÈκÎÁ¬ÈëÁ¬½ÓÇëÇó¡£Èç¹ûϲãЭÒ飬ÈçUDP£¬²»Ö§³ÖÁ¬½Ó£¬INETЭÒé²ã½ÓÊÕ²Ù×÷½«Ê§°Ü¡£·ñÔò½ÓÊÕ²Ù×÷͸¹ýÕæÊµÐ­Òé²ã£¬±¾ÀýÊÇTCP¡£½ÓÊÕ²Ù×÷¿ÉÒÔÊÇ×èÈû»ò·Ç×èÈû¡£ÔÚ·Ç×èÈûÇé¿öÏ£¬Èç¹ûûÓÐÁ¬ÈëÁ¬½Ó¿É½ÓÊÕ£¬Ôò½ÓÊÕ²Ù×÷ʧ°Ü£¬Ð½¨µÄsocket ½á¹¹±»·ÏÆú¡£ÔÚ×èÈûÇé¿öÏ£¬ÍøÂçÓ¦ÓóÌÐòÖ´ÐнÓÊÕ²Ù×÷½«¼ÓÉÏÒ»¸öµÈ´ý¶ÓÁв¢½«Ö®¹ÒÆð£¬Ö±µ½½ÓÊÕµ½TCPÁ¬½ÓÇëÇó¡£µ±½ÓÊÕÒ»¸öÁ¬½ÓÇëÇóºó£¬°üº¬ÇëÇóµÄ sk_buff ±»·ÏÆú£¬²¢ÇÒ sock Êý¾Ý½á¹¹·µ»Øµ½INET socket²ã£¬ÔÚÄÇÓëÒ»¸öеĸüÔ罨Á¢µÄsocket½á¹¹Á¬½Ó¡£ÐÂsocketÎļþÃèÊö·û(fd)ºÅ·µ»Ø¸øÍøÂçÓ¦ÓóÌÐò£¬È»ºó£¬Ó¦ÓóÌÐò¾ÍÄÜÔÚsocket²Ù×÷Öн«ÕâÒ»ÎļþÃèÊö·ûÓÃÓÚн¨Á¢µÄINET BSD socket¡£

10.5  IP²ã

10.5.1  Socket »º´æ

    Ã¿Ò»²ãЭÒéÓÃÁíÍâ²ãÌṩµÄ·þÎñ£¬ÕâÑùʹÓöà²ãÍøÂçЭÒé»áÓÐÒ»¸öÎÊÌ⣺ÿ¸öЭÒé¶¼ÒªÔÚ´«ËÍÊý¾Ýʱ¶¼Òª ¼ÓÉÏЭÒéÍ·ºÍЭÒé⣬¶øÊý¾Ýµ½´ïʱÓÖÒª½«Ö®È¥µô¡£ÕâÑù£¬ÔÚ²»Í¬µÄЭÒé¼äÒªÓÐÊý¾Ý»º´æ£¬Ã¿Ò»²ãÐèÒªÖªµÀÌØ ¶¨Ð­ÒéµÄÍ·ºÍβ·ÅÔÚÄĸöλÖá£Ò»¸ö½â¾ö°ì·¨¾ÍÊÇÔÚÿһ²ãÖж¼¿½±´»º´æ£¬µ«ÕâÑù×öЧÂʾͺܵ͡£LinuxÓà socket»º´æ»òÕß˵ sk_buffs À´ÔÚЭÒé²ãÓëÍøÂçÉ豸Çý¶¯Ö®¼ä½»»»Êý¾Ý¡£ sk_buffs °üÀ¨Ö¸ÕëºÍ×ֶγ¤¶È£¬ÕâÑùÿ ¸öЭÒé²ã¾Í¿ÉÒÔͨ¹ý±ê×¼µÄº¯Êý»ò¡°·½·¨¡±À´²Ù×÷Ó¦ÓóÌÐòÊý¾Ý¡£


ͼ 10.4: Socket »º´æ (sk_buff)

    Í¼  10.4 ÏÔʾÁË sk_buff Êý¾Ý½á¹¹£»Ã¿¸ö sk_buff ÓÐÒ»¸öÊý¾Ý¿éÓëÖ®ÏàÁ¬¡£ sk_buff ÓÐËĸöÖ¸Õ룬ÕâЩָÕë ÓÃÀ´²Ù×÷ºÍ¹ÜÀísocket»º´æµÄÊý¾Ý£º

head
Ö¸ÏòÄÚ´æÖÐÊý¾ÝÇøµÄ¿ªÍ·¡£ÕâÒ»Ö¸ÕëÔÚ sk_buff ºÍÆäÏà¹ØµÄÊý¾Ý¿é·ÖÅäʱ¾Í¹Ì¶¨ÁË¡£
data
Ö¸Ïòµ±Ç°Ð­ÒéÊý¾ÝµÄ¿ªÍ·¡£ÕâÒ»Ö¸ÕëÊÇËæµ±Ç°ÓµÓÐ sk_buff µÄÊÇÄĸöЭÒé²ã¶ø±ä»¯µÄ¡£
tail
Ö¸Ïòµ±Ç°Ð­ÒéÊý¾ÝµÄ½áβ¡£Í¬Ñù£¬ÕâÒ»Ö¸ÕëÒ²ÊÇËæµ±Ç°ÓµÓÐ sk_buff µÄÊÇÄĸöЭÒé²ã¶ø±ä»¯µÄ¡£
end
Ö¸ÏòÄÚ´æÖÐÊý¾ÝÇøµÄ½áβ¡£ÕâÒ»Ö¸ÕëÔÚ sk_buff ºÍÆäÏà¹ØµÄÊý¾Ý¿é·ÖÅäʱ¹Ì¶¨¡£

     len ºÍ truesize ÕâÁ½¸ö×ֶηֱðÓÃÀ´ÃèÊöµ±Ç°Ð­Òé°ü³¤¶ÈºÍÊý¾Ý»º´æ×ÜÌ峤¶È¡£ sk_buff ´¦Àí´úÂëÌṩ±ê×¼µÄ²Ù×÷À´ÏòÓ¦ÓóÌÐòÔö¼ÓºÍÒÆ³ýЭÒéÍ·ºÍЭÒéβ¡£Õâ¾Í¿ÉÒÔ°²È«µØ²Ù×÷ sk_buff ÖÐµÄ data , tail ºÍ len ×ֶΡ£

push
Ëü°Ñ data Ö¸ÕëÖ¸ÏòÊý¾ÝÇøµÄ¿ªÊ¼²¢Ôö¼Ó len ¡£ÓÃÓÚÔÚÒª´«ÊäµÄÊý¾Ý¿ªÊ¼´¦Ôö¼ÓЭÒéÍ·¡£

pull
Ëü°Ñ data Ö¸Õë´ÓÊý¾ÝÇøµÄ¿ªÊ¼´¦ÒƵ½Êý¾ÝÇøµÄ½áβ´¦£¬²¢¼õС len ¡£ÓÃÓÚÔÚÒѽÓÊÕµÄÊý¾Ý¿ªÊ¼´¦ÒƳýЭÒéÍ·¡£

put
Ëü°Ñ tail Ö¸ÕëÖ¸ÏòÊý¾ÝÇøµÄ½áβ´¦£¬²¢Ôö¼Ó len ¡£ÓÃÓÚÔÚÒª´«ÊäµÄÊý¾Ý½áβ´¦Ôö¼ÓÊý¾Ý»òЭÒéÐÅÏ¢¡£

trim
Ëü°Ñ tail Ö¸ÕëÖ¸ÏòÊý¾ÝÇøµÄ¿ªÊ¼´¦£¬²¢¼õС len ¡£ÓÃÓÚÔÚÒѽÓÊÕµÄÊý¾ÝÎ²ÒÆ³ýÊý¾Ý»òЭÒéÐÅÏ¢¡£

    sk_buff ½á¹¹»¹°üº¬ÁËÓÃÓÚһЩָÕ룬ÓÃÓÚÔÚ´¦Àí¹ý³ÌÖдæÈë sk_buff µÄË«Á¬½Ó»·Â·ÁÐ±í¡£Í¨ÓÃsk_buffÀý ³Ì¿ÉÒÔ½« sk_buff ¼ÓÈëµ½ÕâЩÁбíµÄÇ°Ãæ»òºóÃæ£¬Ò²¿ÉÒÔɾ³ýËüÃÇ¡£

10.5.2  ½ÓÊÕIP°ü

    µÚ  dd-chapter ÕÂÃèÊöÁËLinuxµÄÍøÂçÉ豸ÊÇÈçºÎÖÃÈëÄں˲¢³õʼ»¯µÄ¡£Ò»ÏµÁÐ device Êý¾Ý½á¹¹ÔÚ dev_base ±íÖÐÏ໥Á¬½ÓÆðÀ´¡£Ã¿¸ö device ½á¹¹ÃèÊöÁËËüµÄÉ豸²¢Ìṩ»Øµ÷Àý³Ì£¬µ±ÐèÒªÍøÂçÇý¶¯À´Ö´Ðй¤×÷ʱ£¬ÍøÂçЭÒé²ãµ÷ÓÃÕâЩÀý³Ì¡£ÕâЩº¯ÊýÓë´«ÊäµÄÊý¾Ý¼°ÍøÂçÉ豸µØÖ·½ôÃÜÏà¹Ø¡£µ±Ò»¸öÍøÂçÉ豸´ÓÍøÉϽÓÊÕ°üʱ£¬Ëü±ØÐ뽫½ÓÊÕµÄÊý¾Ýת»»³É sk_buff ½á¹¹¡£ÕâЩ sk_buff Ôò±»ÍøÂçÇý¶¯¼ÓÈëµ½ÁË backlog ¶ÓÁÐÖС£

    Èç¹û backlog ¶ÓÁÐÌ«³¤£¬Ôò¶ªÆú½ÓÊÕµÄ sk_buff¡£×¼±¸ºÃÒªÔËÐÐʱ£¬ÍøÂçµ×²ã½«±»ÉèÖñêÖ¾¡£

    µ±ÍøÂçµ×²ã°´¼Æ»®¿ªÊ¼ÔËÐк󣬴¦Àí backlog ¶ÓÁÐ֮ǰ£¬Èκεȴý×ű»´«ÊäµÄÍøÂç°ü¶¼ÓÉËüÀ´´¦Àí¡£ sk_buff ¾ö¶¨ÄÄЩ²ã´¦Àí±»½ÓÊյİü¡£

    LinuxÍøÂç²ã³õʼ»¯Ê±£¬Ã¿Ò»Ð­Òéͨ¹ý½« packet_type ½á¹¹¼ÓÈëµ½ ptype_allÁбí»òptype_base hash±íÖÐÀ´ ×¢²áËü×Ô¼º¡£packet_type ½á¹¹°üº¬ÁËЭÒéÀàÐÍ£¬Ò»¸öÖ¸ÏòÍøÂçÉ豸µÄÖ¸Õ룬һ¸öÖ¸ÏòЭÒéµÄ½ÓÊÕÊý¾Ý´¦ÀíÀý³ÌµÄÖ¸Õ룬×îºó»¹°üÀ¨Ò»¸öÖ¸ÏòÁбíÁ´»òhashÁ´ÖÐÏÂÒ»¸ö packet_type ½á¹¹µÄÖ¸Õë¡£ptype_all Á´ÓÃÓÚ¼àÌý´ÓÍøÂçÉ豸ÉϽÓÊÕµÄËùÓаü£¬Í¨³£²»Ê¹ÓÃËü¡£ptype_base hash±íÊDZ»Ð­Òé±êʶ·ûŪÂҵģ¬ÓÃÓÚ¾ö¶¨ÄĸöЭÒ齫½ÓÊÕ´«ÈëµÄÍøÂç°ü¡£ÍøÂçµ×²ãͨ¹ýÁ½¸ö±íÖеÄÒ»¸ö»ò¶à¸ö packet_type ÏîÀ´Æ¥Åä´«Èë sk_buff µÄЭÒéÀàÐÍ¡£Ð­Òé¿ÉÒԺͶàÓÚÒ»¸öµÄÏîÏàÆ¥Å䣬ÈçÔÚ¼àÌýÍøÉÏËùÓеĴ«ÊäʱҪ¸´Öƶà¸ö sk_buff ¡£ sk_buff ½«Í¨¹ý±»Æ¥ÅäЭÒé´¦ÀíÀý³Ì¡£

10.5.3  ·¢ËÍIP°ü

    Ó¦ÓóÌÐò½»»»Êý¾ÝʱҪ´«Êä°ü£¬·ñÔòÓÉÍøÂçЭÒéÔÚ½¨Á¢Á¬½Ó»òÖ§³ÖÒ»¸öÒѽ¨Á¢µÄÁ¬½ÓʱÀ´Éú³É¡£ÎÞÂÛÊý¾Ý ÊÇÓÉÄÄÖÖ·½·¨Éú³ÉµÄ£¬¶¼Òª½¨Á¢Ò»¸ö sk_buff À´°üº¬Êý¾Ý£¬µ±Í¨¹ýЭÒé²ãʱ£¬ÕâЩЭÒé²ã»á¼ÓÉϸ÷ÖÖÍ·¡£

    sk_buff ÐèҪͨ¹ýÍøÂçÉ豸´«Êä¡£Ê×ÏÈЭÒ飬ÈçIP£¬ÐèҪȷ¶¨ÊÇÄĸöÍøÂçÉ豸ÔÚÓá£ÕâÓÐÀµÓÚ°üµÄ×î¼Ñ· ÓÉ¡£¶ÔÓÚͨ¹ýmodemÁ¬ÈëÒ»¸ö¼òµ¥ÍøÂ磬Èçͨ¹ýPPPЭÒ飬µÄ¼ÆËã»úÀ´Ëµ£¬Â·ÓɵÄÑ¡ÔñÊǺܼòµ¥µÄ¡£°üÓ¦¸Ãͨ¹ý ±¾µØ»·Â·É豸·¢Ë͸ø±¾µØÖ÷»ú£¬»ò·¢Ë͸øPPP modemÁ¬½ÓµÄÍø¹Ø¡£¶ÔÓÚÁ¬ÔÚÒÔÔÚÍøÉϵļÆËã»úÀ´Ëµ£¬Á¬½ÓÔÚÍø ÂçÉϵļÆËã»úÔ½¶à£¬Â·ÓÉÔ½¸´ÔÓ¡£

    ¶ÔÓÚÿһ¸ö±»´«ÊäµÄIP°ü£¬IPÓ÷ÓɱíÀ´ÎªÄ¿µÄIPµØÖ·½âÎö·ÓÉ¡£´Ó·ÓɱíÖгɹ¦µØÕÒµ½Ä¿µÄIPʱ½«·µ»ØÒ»¸öÃèÊöÁËҪʹÓõÄ·ÓÉµÄ rtable ½á¹¹¡£Õâ°üÀ¨ÒªÓõ½µÄÔ´IPµØÖ·£¬ÍøÂç device ½á¹¹µÄµØÖ·£¬ÓÐʱ»¹ÓÐÔ¤½¨Á¢µÄÓ²¼þÍ·¡£ÕâЩӲ¼þÍ·ÊÇÍøÂçÉè±¸ÌØ¶¨µÄ£¬°üº¬ÁËÔ´ºÍÄ¿µÄµÄÎïÀíµØÖ·ºÍÆäËüµÄÌØ¶¨Ã½ÌåÐÅÏ¢¡£Èç¹ûÍøÂçÉ豸ÊÇÒ»¸öÒÔÌ«ÍøÉ豸£¬Ó²¼þÍ·ÔòÓ¦Èçͼ  10.1 Ëùʾ£¬²¢ÇÒÔ´ºÍÄ¿µÄµØÖ·Ó¦ÊÇÎïÀíµÄÒÔÌ«ÍøµØÖ·¡£Ó²¼þÍ·ÔÚ·ÓɵÄʱºò»á»º´æÆðÀ´£¬ÒòΪ±ØÐ뽫Ëü¼Óµ½Ã¿Ò»¸öÒª´«ÊäµÄIP°üÖС£Ó²¼þÍ·°üº¬µÄÎïÀíµØÖ·ÒªÓÃARPЭÒéÀ´½âÎö¡£´«³öµÄ°üÔÚµØÖ·±»½âÎöºó²Å»á·¢³ö¡£½âÎöÁ˵ØÖ·ºó£¬Ó²¼þÍ·±»»º´æÆðÀ´ÒÔ±ãÒÔºóµÄIP°üÔÚʹÓÃÕâÒ»½Ó¿Úʱ²»ÐèÒªÔÙʹÓÃARP¡£

10.5.4  Êý¾Ý·Ö¿é

    Ã¿¸öÍøÂçÉ豸¶¼ÓÐÒ»¸ö°ü´óСµÄ×î´óÖµ£¬·¢ËÍ»ò½ÓÊÕÊý¾Ý°ü²»ÄܱÈÕâÒ»Öµ´ó¡£IPЭÒéÔÊÐí½«Êý¾Ý·Ö³É¸üСµ¥ÔªÒÔ±ãÍøÂçÉ豸ÄÜ´¦Àí¡£IPЭÒéÍ·Óзֿé×ֶΣ¬ËüÀïÃæ°üº¬ÁËÒ»¸ö±êÖ¾ºÍ·Ö¸îÆ«ÒÆÁ¿¡£

    µ±IP°ü×¼±¸Òª´«Êäʱ£¬IPÕÒµ½ÍøÂçÉ豸À´½«IP°ü·¢ËͳöÈ¥¡£Õâ¸öÉ豸ÊÇ´ÓIP·ÓɱíÖÐÕÒµ½µÄ¡£Ã¿Ò» device ½á¹¹ÖÐÓÐÒ»Ïî mtu £¬ÓÃÀ´ÃèÊö×î´ó´«Êäµ¥Ôª£¨ÒÔ×Ö½ÚΪµ¥Î»£©¡£Èç¹ûÉ豸µÄ mtu ±ÈÒª´«ÊäµÄIP°üµÄ°ü´óСҪС£¬ÔòIP°ü±ØÐë±»·Ö¸î³É¸üСµÄµ¥Ôª¡£Ã¿Ò»µ¥ÔªÓÃÒ»¸ö sk_buff ½á¹¹À´±íÕ÷£»ËüµÄIPÍ·»á±»×öÉϱê¼ÇÒÔ±êʶËüÊÇÒ»¸ö·Ö¿éÁ˵İü£¬ÆäÖл¹°üº¬·Ö¸îÆ«ÒÆÁ¿¡£×îºóÒ»¸ö°ü±»±êʶΪ×îºóIPµ¥Ôª¡£Èç¹ûÔÚ·Ö¿é¹ý³ÌÖУ¬IP²»ÄÜ·ÖÅä sk_buff £¬Ôò´«Êäʧ°Ü¡£

    ½ÓÊÕIP·Ö¿éµ¥ÔªÒª±È·¢ËÍËüÃÇÒªÂ鷳һЩ£¬ÒòΪÕâЩIPµ¥Ôª¿ÉÄÜÒÔÈκÎ˳Ðòµ½´ï£¬±ØÐëËùÓеĵ¥Ôª¶¼½ÓÊÕ µ½ÁËÒÔºó²ÅÄÜÖØÐ½«ËüÃÇ×é×°ÆðÀ´¡£Ã¿½ÓÊÕÒ»¸öIP°ü¶¼Òª¼ì²éÆäÊÇ·ñÊÇIP·Ö¸îµ¥Ôª¡£ÔÚµÚÒ»¸öIP·Ö¸îµ¥Ôªµ½´ï ʱ£¬IP»á½¨Á¢Ò»¸öÐ嵀 ipq ½á¹¹£¬ÕâÒ»½á¹¹ÓëÓÃÓÚIPµ¥ÔªÖØ×éµÄ ipqueue ÁбíÏàÁ¬¡£µ±½ÓÊÕµ½¸ü¶àµÄIPµ¥ÔªÊ±£¬ÏÈÕÒµ½ÕýÈ·µÄ ipq ½á¹¹£¬²¢ÎªÃ¿¸öµ¥ÔªÐ½¨Á¢Ò»¸ö ipfrag ½á¹¹¡£Ã¿¸ö ipq ½á¹¹Î¨Ò»µØÃèÊöÒ»¸ö½ÓÊÕIP·Ö¸îµ¥ÔªµÄ£¬°üÀ¨ËüµÄÔ´ºÍÄ¿µÄIPµØÖ·£¬ÉϲãЭÒé±êʶºÍ±¾IPÖ¡µÄ±êʶ¡£µ±½ÓÊÕµ½ËùÓеÄIP·Ö¸îµ¥Ôªºó£¬½«ËüÃÇÖØÐÂ×é³ÉÒ»¸ö sk_buff £¬È»ºó½»¸øÉϲãЭÒé´¦Àí¡£Ã¿¸ö ipq Öаüº¬Ò»¸ö¶¨Ê±Æ÷£¬ËüÔÚÿ½ÓÊÕµ½Ò»¸öºÏ·¨µÄµ¥ÔªºóÖØÐÂʱ¡£Èç¹û¶¨Ê±Æ÷µ½Ê±£¬ ipq ½á¹¹ºÍËüµÄһЩ ipfrag ½á¹¹½«±»¶ªÆú£¬´«Ë͵ÄÐÅÏ¢Ôò±»¼Ù¶¨Îª¶ªÊ§¡£È»ºóÌá½»¸ø²ãЭÒéÀ´ÖØ´«¸ÃÐÅÏ¢¡£

10.6  µØÖ·½âÎöЭÒé (ARP)

    µØÖ·½âÎöЭÒéµ£µ±ÁËÒ»¸ö°ÑIPµØÖ··­Òë³ÉÎïÀíÓ²¼þµØÖ·ÈçÒÔÌ«ÍøµØÖ·µÄ½ÇÉ«¡£IPÔÚ½«Êý¾Ý£¨ÒÔ sk_buff µÄÐÎʽ)ͨ¹ýÉ豸Çý¶¯´«ËÍʱÐèÒªÕâһת»»¡£

    ËüÖ´Ðи÷ÖÖ¼ì²é£¬À´¿´ÊÇ·ñÕâÒ»É豸ÐèÒªÓ²¼þÍ·£¬ÊÇ·ñÐèÒªÖØ½¨°üµÄÓ²¼þÍ·¡£Linux»º´æÁËÓ²¼þÍ·£¬ÕâÑù¿ÉÒÔ±ÜÆµ·±Öؽ¨¡£Èç¹ûÐèÒªÖØ½¨Ó²¼þÍ·£¬Ôòµ÷ÓÃÉ豸ָ¶¨µÄÓ²¼þÍ·ÖØ½¨Àý³Ì¡£ËùÓеÄÒÔÌ«ÍøÉ豸ʹÓÃÏàͬµÄÍ·ÖØÀý³Ì£¬ÕâЩÀý³Ì½«Ä¿µÄIPµØÖ·×ª»»³ÉÎïÀíµØÖ·¡£

    ARPЭÒé±¾ÉíÊǺܼòµ¥µÄ£¬Ëü°üÀ¨Á½¸öÏûÏ¢ÀàÐÍ£¬ARPÇëÇóÓëARPÓ¦´ð¡£ARPÇëÇó°üº¬ÁËÐèÒª½âÎöµÄIPµØÖ·£¬ARPÓ¦´ð£¨Ï£ÍûËü£©°üº¬±»½âÎöµÄIPµØÖ·£¬Ó²¼þµØÖ·¡£ARPÇëÇóÏòÁ¬½ÓÔÚÍøÂçÉϵÄËùÓÐÖ÷»ú¹ã²¥£¬Òò´Ë£¬¶ÔÓÚÒÔÍø£¬ËùÓÐÁ¬ÔÚÍøÉϵĻúÆ÷¶¼ÄÜ¿´µ½ARPÇëÇó¡£ÓµÓÐARPÇëÇóÖеÄIPµØÖ·µÄ»úÆ÷½«·¢³ö°üº¬ÁËËü×Ô¼ºµÄÎïÀíµØÖ·ARPÓ¦´ð¡£

    ARPЭÒéÔÚLinuxÖÐÊÇÎ§ÈÆ arp_table ½á¹¹±íÀ´½¨Á¢µÄ£¬Ã¿¸ö½á¹¹ÃèÊöÒ»¸öIPµ½ÎïÀíµØÖ·µÄת»»¡£ÕâЩ±íÏî ÔÚÐèÒª½øÐÐIPµØÖ·½âÎöʱÉú³É£¬ÔÚËæÊ±¼ä±ä¾Éʱ±»É¾³ý¡£Ã¿¸ö arp_table ½á¹¹ÓÐÈçÏÂ×Ö¶Î:

 
last used ±¾ARPÏî×î½üÒ»´ÎʹÓõÄʱ¼ä
last updated ±¾ARPÏî×î½üÒ»´Î¸üеÄʱ¼ä
flags ÃèÊö±¾ÏîµÄ״̬£¬ÈçÊÇ·ñÍê³ÉµÈ
IP address ±¾ÏîÃèÊöµÄIPµØÖ·
hardware address Òª½âÎöµÄÓ²¼þµØÖ·
hardware header Ö¸Ïò»º´æÓ²¼þÍ·µÄÖ¸Õë
timer ÊǸö timer_list ÏÓÃÓÚARPÇëÇóûÓÐÏìӦʱµÄ³¬Ê±
retries ARPÇëÇóÖØÊԵĴÎÊý
sk_buff queue µÈ´ýIPµØÖ·½âÎöµÄsk_buffÏîÁбí

    ARP±í°üÀ¨ÁËÖ¸Ïò arp_table Á´µÄÖ¸Õ루 arp_table ÏòÁ¿£©¡£»º´æÕâЩ±íÏî¿ÉÒÔ¼ÓËÙ¶ÔËüÃǵķÃÎÊ£¬Ã¿¸ö±íÏîÓÃIPµØÖ·µÄ×îºóÁ½¸ö×Ö½ÚÀ´Éú³ÉË÷Òý£¬È»ºó¾Í¿ÉÒÔ²éÕÒ±íÁ´ÒÔÕÒµ½ÕýÈ·µÄ±íÏî¡£LinuxÒ²ÒÔ hh_cache ½á¹¹µÄÐÎʽÀ´»º´æ arp_table ÏîµÄÔ¤½¨µÄÓ²¼þÍ·¡£

    ÇëÇóÒ»¸öIPµØÖ·½âÎö²¢ÇÒûÓÐÏàÓ¦µÄ arp_table Ïîʱ£¬ARP±ØÐë·¢ËÍÒ»¸öARPÇëÇó¡£ËüÔÚ±íºÍsk_buff¶ÓÁÐÖÐ Éú³ÉÒ»¸öÐ嵀 arp_table Ï sk_buff °üº¬ÁËÐèÒª½øÐеØÖ·½âÎöµÄÍøÂç°ü¡£·¢ËÍARPÇëÇóʱÔËÐÐARP¶¨Ê±Æ÷¡£Èç¹ûûÓÐÏìÓ¦£¬ARP½«ÖØÊÔ¼¸´Î£¬Èç¹ûÈÔȻûÓÐÏìÓ¦£¬ARP½«É¾³ý¸Ã arp_table Ïͬʱ»á֪ͨ¶ÓÁÐÖеȴýIPµØÖ·½âÎöµÄ sk_buff ½á¹¹£¬´«ËÍËüÃǵÄÉϲãЭÒ齫´¦ÀíÕâһʧ°Ü¡£UDP²»¹ØÐĶª°ü£¬¶øTCPÔò»á½¨Á¢TCPÁ¬½Ó½øÐÐÖØ´«¡£Èç¹ûIPµØÖ·µÄËùÓÐÕß·µ»ØÁËËüµÄÓ²¼þµØÖ·£¬Ôò arp_table Ïî±»±ê¼ÇΪÍê³É£¬¶ÓÁÐÖеÄsk_buff½«±»É¾³ý£¬´«Ê䶯×÷¼ÌÐø¡£Ó²¼þµØÖ·±»Ð´µ½Ã¿¸ösk_buffµÄÓ²¼þÍ·ÖС£

    ARPЭÒé²ã±ØÐëÏìÓ¦ARPÇëÇó¡£Ëü×¢²áËüµÄЭÒéÀàÐÍ(ETH_P_ARP)£¬Éú³ÉÒ»¸ö packet_type ½á¹¹¡£Õâ±íʾËü½«¼ì²éÍøÂçÉ豸ÊÕµ½µÄËùÓÐARP°ü¡£ÓëARPÓ¦´ðÒ»Ñù£¬Õâ°üÀ¨ARPÇëÇó¡£Óñ£´æÔÚ½ÓÊÕÉ豸µÄ device ½á¹¹ÖеÄÓ²¼þµØÖ·À´Éú³ÉARPÓ¦´ð¡£

    ÍøÂçÍØÆË½á¹¹»áËæÊ±¼ä¸Ä±ä£¬IPµØÖ·»á±»ÖØÐ·ÖÅ䲻ͬµÄÓ²¼þµØÖ·¡£ÀýÈ磬һЩ²¦ºÅ·þÎñΪÿһ´Îн¨µÄÁ¬½Ó·ÖÅäÒ»¸öIPµØÖ·¡£ÎªÁËʹARP±í°üº¬ÕâЩÊý¾ÝÏARPÔËÐÐÒ»¸öÖÜÆÚÐԵĶ¨Ê±Æ÷£¬ÓÃÀ´²é¿´ËùÓÐµÄ arp_table ÏîÖÐÄÄÒ»¸ö³¬Ê±¡£Òª×¢Òâ²»ÒªÒÆ³ý°üº¬Ò»¸ö»ò¶à¸ö»º´æÓ²¼þÍ·µÄÏî¡£ÒÆ³ýÕâЩÏîÊǺÜΣÏյģ¬ÒòΪÆäËüµÄÊý¾Ý½á¹¹ÒªÓõ½ËüÃÇ¡£Ò»Ð© arp_table Ïî±»±ê¼ÇΪÓÀ¾ÃµÄ£¬ËüÃDz»»á±»ÊÍ·Å¡£ARP±í²»ÄÜÌ«´ó£»Ã¿¸ö arp_table Ïî»áÏûºÄһЩºËÐÄÄÚ´æ¡£Òª·ÖÅäÒ»¸öеıíÏî¶øARP±íµÄ´óСÒѾ­µ½´ïËüµÄ×î´óֵʱ£¬¾ÍÒª²éÕÒ²¢É¾³ý×îÀϵıíÏî¡£

10.7  IP ·ÓÉ

    IP·Óɺ¯Êý¾ö¶¨Á˽«Ô¤¶¨µÄÓÐÖ¸¶¨IPµØÖ·µÄIP°üË͵½ÄÄ¡£ÔÚ´«ËÍIP°üʱÓкܶàÖÖÑ¡Ôñ¡£ÄÜ×îÖÕµ½´ïÄ¿±êÂð£¿Èç¹ûÄÜ£¬ÒªÓõ½ÄĸöÍøÂçÉè±¸ÄØ£¿Èç¹ûÓжàÓÚÒ»¸öµÄÍøÂçÉ豸¿É±»Ê¹Óã¬ÄÄÒ»¸öÊǽϺõÄÄØ£¿IP·ÓÉÊý¾Ý¿âÀï´æµÄÐÅÏ¢¸ø³öÁËÕâЩÎÊÌâµÄ´ð°¸¡£ÓÐÁ½¸öÊý¾Ý¿â£¬×îÖØÒªµÄÒ»¸öÊÇForwarding Information Database¡£ÕâÊÇÒ»¸öÓйØÒÑÖªµÄÄ¿µÄIPºÍËüÃǵÄ×î¼Ñ·ÓɵÄÏéϸÁÐ±í£¬route cacheÔòÓÃÀ´¿ìËÙÕÒµ½Ä¿µÄIPµÄ·ÓÉ¡£ºÍÆäËüµÄ»ºÒ»Ñù£¬Ëü°üº¬µÄÖ»Êdz£ÓõÄ·ÓÉ£»ËüµÄÄÚÈÝÀ´×ÔForwarding Information Database¡£

    Í¨¹ýIOCTLÇëÇó¿É½«Â·ÓɼÓÈëµ½BSD socket½Ó¿Ú»ò´ÓÖÐɾ³ý¡£ÕâЩÊÇͨ¹ýЭÒéÀ´ÊµÏֵġ£INETЭÒé²ãÖ»ÔÊÐí ´¦ÀíÓг¬¼¶Óû§È¨ÏÞµÄIP·ÓɵÄÌí¼ÓÓëɾ³ý¡£ÕâЩ·ÓÉ¿ÉÒÔÊǹ̶¨µÄ£¬Ò²¿ÉÒÔËæÊ±¼ä¶ø¶¯Ì¬¸Ä±ä¡£´ó¶àÊýϵͳʹÓù̶¨Â·ÓÉ¡£Â·ÓÉÆ÷ÔËÐзÓÉЭÒ飬·ÓÉЭÒé³ÖÐøµØ¼ì²éËùÓÐÒÑ֪ĿµÄIPµÄ¿ÉµÃµ½µÄ·ÓÉ¡£Ã»ÓзÓÉÆ÷µÄϵͳÊǶËϵͳ¡£Â·ÓÉЭÒéÊÇ×÷Ϊһ¸öÊØ»¤½ø³ÌÀ´ÊµÏֵģ¬ÈçGATED£¬ËüÃÇÒ²ÓÃIOCTLÀ´ÏòBSD socket½Ó¿ÚÌí¼ÓºÍɾ³ý·ÓÉ¡£

10.7.1  ·ÓÉ»º´æ

    ÎÞÂÛʲôʱºò²éÕÒIP·ÓÉ£¬Ê×Ïȶ¼ÒªÔÚ·ÓÉ»º´æÖмì²éÊÇ·ñÓÐÆ¥ÅäµÄ·ÓÉ¡£Èç¹û·ÓÉ»º´æÀïûÓÐÆ¥ÅäµÄ·ÓÉ£¬ÔòÒª´ÓForwarding Information DatabaseÖвéÕÒ·ÓÉ¡£Èç¹ûÄÇÀïҲûÓÐÕÒµ½Â·ÓÉ£¬ÔòIP°ü·¢ËÍʧ°Ü²¢Í¨ÖªÓ¦ÓóÌÐò¡£Èç¹ûÔÚ·ÓÉ»º´æÖÐûÓжøÔÚForwarding Information DatabaseÖÐÕÒµ½Â·ÓÉ£¬Ôò»áΪЩ·ÓÉÉú³ÉÒ»¸öÐÂÏ²¢Ìí¼Óµ½Â·ÓÉ»º´æÖС£Â·ÓÉ»º´æÊÇÒ»¸ö±í(ip_rt_hash_table)£¬Ëü°üÀ¨Ö¸ÏòrtableÊý¾Ý½á¹¹Á´µÄÖ¸Õë¡£hashº¯ÊýÀûÓÃIPµØÖ·ÖÐ×îС×îÖØÒªµÄÁ½¸ö×Ö½ÚÀ´´Ó·ÓɱíÖнøÐÐË÷Òý¡£ÕâÁ½¸ö×Ö½ÚÊÇÔÚÄ¿µÄÓëÌṩµÄ×î¼ÑhashÖµ¼äÊDz»Í¬µÄ¡£µÚ¸örtableÏî°üº¬Â·ÓÉÐÅÏ¢£¬Ä¿µÄIPµØÖ·£¬ÓÃÓÚµ½´ïÄǸöIPµØÖ·µÄÍøÂçÉ豸£¬ÐÅÏ¢´óСµÄ×î´óÖµµÈµÈ¡£Ëü»¹ÓÐÒ»¸öreference count£¬Ò»¸öusage countºÍÒ»¸ö×î½üÒ»´Î±»ÓõÄʱ¼äÐÅÏ¢£¨ÔÚ jiffies À¡£reference countÔÚÿ´Î·ÓɺóÔö¼Ó£¬ÓÃÓÚÏÔʾ¸Ã´Î·ÓɵÄÍøÂçÁ¬½ÓÊý¡£ËüÔÚÓ¦ÓóÌÐòֹͣʹÓ÷ÓÉʱ¼õС¡£useage countÔÚÿ´Î²éÕÒ·ÓÉʱÔö¼Ó£¬ÓÃÓÚ½« rtable ÏîÔÚËüµÄhashÁ´ÖÐÅÅÐò¡£Â·ÓÉ»º´æÖеĶÔÓÚËùÓÐÏîµÄ×îºó±»ÓÃʱ¼äÐÅÏ¢½«±»ÖÜÆÚÐԵؼì²é£¬ÒÔÈ·¶¨ÊÇ·ñ rtable ÒѾ­¾ÉÁË¡£Èç¹ûijһ·ÓÉ×î½üûÓб»Ê¹Óã¬Ôò´Ó·ÓÉ»º´æÖн«Ö®¶ªÆú¡£ÓÉÓÚ·ÓÉ»º´æÖеÄ·ÓÉÔÚÓÐÐòµÄ£¬ËùÒÔ³£ÓõÄ·ÓÉ»áÅÅÔÚhashÁ´µÄÇ°Ãæ¡£ÕâÒâζ×ÅÄܸü¿ìµØÕÒµ½ÕâЩ·ÓÉ¡£

10.7.2  The Forwarding Information Database


ͼ 10.5: The Forwarding Information Database

    Forwarding Information Database£¨Èçͼ  10.5 Ëùʾ£©°üº¬¶Ôµ±Ç°ÏµÍ³µ±Ç°Ê±¼ä¿ÉµÃµ½µÄIP·ÓÉ¡£ËüÊÇÒ»¸ö ºÜ¸´ÔÓµÄÊý¾Ý½á¹¹£¬¾¡¹Ü½øÐÐÁ˺ÏÀíÓÐЧµÄ°²ÅÅ£¬ËüÈÔÈ»²»ÊÇÒ»¸ö¿ìËÙµÄÊý¾Ý¿â¡£ÌرðÊÇÒªÔÚÕâ¸öÊý¾Ý¿âÖÐΪÿһҪ´«Ë͵ÄIP°ü²éÕÒÄ¿µÄµØÊ±½«»á·Ç³£Âý¡£Õâ¾ÍÊÇÒªÓ÷ÓÉ»º´æµÄÔ­Òò£º¿ÉÒÔÓÃÒÑÖªµÄºÃµÄ·ÓÉÀ´¼ÓËÙIP°üµÄ´«ËÍ¡£Â·ÓÉ»º´æÖеÄ·ÓÉÀ´Ô´ÓÚForwarding Information Database¡£

    Ã¿¸öIP×ÓÍøÓÃÒ»¸ö fib_zone ½á¹¹À´ÃèÊö¡£ fib_zone hash±íÖ¸Ïò×ÅÕâЩ½á¹¹¡£hashË÷ÒýÀ´Ô´ÓÚIP×ÓÍøÑÚÂë¡£ËùÓÐͨÏòͬһ×ÓÍøµÄ·ÓÉÓÉ fib_node ºÍ fib_info ½á¹¹À´ÃèÊö£¬ÕâÁ½½á¹¹ÔÚÿ¸ö fib_zone ½á¹¹µÄ fz_list ÖÐÅŶӡ£Èç¹ûÕâ¸ö×ÓÍøÖеÄ·ÓÉÊýÔö´ó£¬ÔòÉú³ÉÒ»¸öhash±í£¬ÒÔʹ²éÕÒ fib_node ½á¹¹¸ü¼ÓÈÝÒס£

    Í¨Ïòͬһ×ÓÍø¿ÉÒÔÓжà¸ö·ÓÉ£¬ÕâЩ·ÓÉ¿ÉÄÜͨ¹ý¶à¸öÍø¹ØÖеÄÒ»¸ö¡£IP·Óɲ㲻ÔÊÐíÓÃͬһ¸öÍø¹Ø¶ÔÒ»¸ö×ÓÍøÓжàÓÚÒ»¸öµÄ·ÓÉ¡£»»ÑÔÖ®£¬Èç¹ûͨÏòͬһ×ÓÍøÓжà¸ö·ÓÉ£¬Ôòÿ¸ö·ÓÉÒª±£Ö¤Ê¹ÓÃÒ»¸ö²»Í¬µÄÍø¹Ø¡£Óëÿ¸ö·ÓÉÏà¹ØµÄÓÐÒ»¸ö metric ½á¹¹¡£ËüÓÃÀ´²âÁ¿¸Ã·ÓÉÓжàÓÅ¡£Ò»¸ö·ÓÉµÄ metric ʵÖÊÉÏÊÇËüÔÚµ½´ïÄ¿µÄ×ÓÍøÇ°Ëù¾­¹ýµÄIP×ÓÍøÊý¡£ metric Ô½´ó£¬Â·ÓÉÔ½²î¡£

 


½Å×¢:

1 National Science Foundation

2 Synchronous Read Only Memory

3 duh? What used for?


File translated from TEX by TTH, version 1.0.
Top of Chapter, Table of Contents, Show Frames, No Frames
© 1996-1999 David A Rusling copyright notice.