From 5669f69b67e0ddacf0befe4f999683b57d30b955 Mon Sep 17 00:00:00 2001 From: Xie Boyu Date: Tue, 27 Feb 2018 17:31:50 +0800 Subject: [PATCH 1/5] add --- pics/TIM截图20180227172950.png | Bin 0 -> 152630 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 pics/TIM截图20180227172950.png diff --git a/pics/TIM截图20180227172950.png b/pics/TIM截图20180227172950.png new file mode 100644 index 0000000000000000000000000000000000000000..1cb6971e5b053040a6370c5241d0ef671c18831a GIT binary patch literal 152630 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¬f$Dh}^zG?R9 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 URJez?Z-9?DL`Jw0tn2qb0G2z>AOHXW literal 0 HcmV?d00001 From eb4005fe1ca41557f8e06478de3ca27b5ec41f96 Mon Sep 17 00:00:00 2001 From: Xie Boyu Date: Tue, 27 Feb 2018 17:34:30 +0800 Subject: [PATCH 2/5] =?UTF-8?q?Update=20=E8=AE=A1=E7=AE=97=E6=9C=BA?= =?UTF-8?q?=E7=BD=91=E7=BB=9C.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- notes/计算机网络.md | 891 ++++++++++++++++++++++++-------------------- 1 file changed, 488 insertions(+), 403 deletions(-) diff --git a/notes/计算机网络.md b/notes/计算机网络.md index 7b5e4931..144661e2 100644 --- a/notes/计算机网络.md +++ b/notes/计算机网络.md @@ -1,834 +1,919 @@ -* [µÚÒ»Õ ¸ÅÊö](#µÚÒ»ÕÂ-¸ÅÊö) - * [ÍøÂçµÄÍøÂç](#ÍøÂçµÄÍøÂç) +* [第一章 概述](#第一章-概述) + * [网络的网络](#网络的网络) * [ISP](#isp) - * [»¥ÁªÍøµÄ×é³É](#»¥ÁªÍøµÄ×é³É) - * [Ö÷»úÖ®¼äµÄͨÐÅ·½Ê½](#Ö÷»úÖ®¼äµÄͨÐÅ·½Ê½) - * [µç·½»»»Óë·Ö×é½»»»](#µç·½»»»Óë·Ö×é½»»») - * [1. µç·½»»»](#1-µç·½»»») - * [2. ±¨ÎĽ»»»](#2-±¨ÎĽ»»») - * [3. ·Ö×é½»»»](#3-·Ö×é½»»») - * [ʱÑÓ](#ʱÑÓ) - * [1. ·¢ËÍʱÑÓ](#1-·¢ËÍʱÑÓ) - * [2. ´«²¥Ê±ÑÓ](#2-´«²¥Ê±ÑÓ) - * [3. ´¦ÀíʱÑÓ](#3-´¦ÀíʱÑÓ) - * [4. ÅŶÓʱÑÓ](#4-ÅŶÓʱÑÓ) - * [¼ÆËã»úÍøÂçÌåϵ½á¹¹*](#¼ÆËã»úÍøÂçÌåϵ½á¹¹) - * [1. Æß²ãЭÒé](#1-Æß²ãЭÒé) - * [2. Îå²ãЭÒé](#2-Îå²ãЭÒé) - * [3. Êý¾ÝÔÚ¸÷²ãÖ®¼äµÄ´«µÝ¹ý³Ì](#3-Êý¾ÝÔÚ¸÷²ãÖ®¼äµÄ´«µÝ¹ý³Ì) - * [4. TCP/IP Ìåϵ½á¹¹](#4-tcpip-Ìåϵ½á¹¹) -* [µÚ¶þÕ ÎïÀí²ã](#µÚ¶þÕÂ-ÎïÀí²ã) - * [ͨÐÅ·½Ê½](#ͨÐÅ·½Ê½) - * [´øÍ¨µ÷ÖÆ](#´øÍ¨µ÷ÖÆ) - * [ÐŵÀ¸´Óü¼Êõ](#ÐŵÀ¸´Óü¼Êõ) - * [1. Ƶ·Ö¸´Óá¢Ê±·Ö¸´ÓÃ](#1-Ƶ·Ö¸´ÓÃʱ·Ö¸´ÓÃ) - * [2. ͳ¼ÆÊ±·Ö¸´ÓÃ](#2-ͳ¼ÆÊ±·Ö¸´ÓÃ) - * [3. ²¨·Ö¸´ÓÃ](#3-²¨·Ö¸´ÓÃ) - * [4. Âë·Ö¸´ÓÃ](#4-Âë·Ö¸´ÓÃ) -* [µÚÈýÕ Êý¾ÝÁ´Â·²ã](#µÚÈýÕÂ-Êý¾ÝÁ´Â·²ã) - * [Èý¸ö»ù±¾ÎÊÌâ](#Èý¸ö»ù±¾ÎÊÌâ) - * [1. ·â×°³ÉÖ¡](#1-·â×°³ÉÖ¡) - * [2. ͸Ã÷´«Êä](#2-͸Ã÷´«Êä) - * [3. ²î´í¼ì²â](#3-²î´í¼ì²â) - * [µã¶ÔµãÐŵÀ - PPP ЭÒé](#µã¶ÔµãÐŵÀ---ppp-ЭÒé) - * [¾ÖÓòÍøµÄÍØÆË](#¾ÖÓòÍøµÄÍØÆË) - * [¹ã²¥ÐŵÀ - CSMA/CD ЭÒé*](#¹ã²¥ÐŵÀ---csmacd-ЭÒé) - * [¼¯Ï߯÷](#¼¯Ï߯÷) - * [MAC ²ã](#mac-²ã) - * [ÐéÄâ¾ÖÓòÍø](#ÐéÄâ¾ÖÓòÍø) -* [µÚËÄÕÂ ÍøÂç²ã*](#µÚËÄÕÂ-ÍøÂç²ã) - * [Íø¼ÊЭÒé IP ¸ÅÊö](#Íø¼ÊЭÒé-ip-¸ÅÊö) - * [IP Êý¾Ý±¨¸ñʽ](#ip-Êý¾Ý±¨¸ñʽ) - * [IP µØÖ·±àÖ·](#ip-µØÖ·±àÖ·) - * [1. ·ÖÀà](#1-·ÖÀà) - * [2. ×ÓÍø»®·Ö](#2-×ÓÍø»®·Ö) - * [3. ÎÞ·ÖÀà](#3-ÎÞ·ÖÀà) - * [IP µØÖ·ºÍ MAC µØÖ·](#ip-µØÖ·ºÍ-mac-µØÖ·) - * [µØÖ·½âÎöЭÒé ARP](#µØÖ·½âÎöЭÒé-arp) - * [·ÓÉÆ÷µÄ½á¹¹](#·ÓÉÆ÷µÄ½á¹¹) - * [½»»»»úÓë·ÓÉÆ÷µÄÇø±ð](#½»»»»úÓë·ÓÉÆ÷µÄÇø±ð) - * [·ÓÉÆ÷·Ö×éת·¢Á÷³Ì](#·ÓÉÆ÷·Ö×éת·¢Á÷³Ì) - * [·ÓÉÑ¡ÔñЭÒé](#·ÓÉÑ¡ÔñЭÒé) - * [1. ÄÚ²¿Íø¹ØÐ­Òé RIP](#1-ÄÚ²¿Íø¹ØÐ­Òé-rip) - * [2. ÄÚ²¿Íø¹ØÐ­Òé OSPF](#2-ÄÚ²¿Íø¹ØÐ­Òé-ospf) - * [3. Íâ²¿Íø¹ØÐ­Òé BGP](#3-Íâ²¿Íø¹ØÐ­Òé-bgp) - * [Íø¼Ê¿ØÖƱ¨ÎÄЭÒé ICMP](#Íø¼Ê¿ØÖƱ¨ÎÄЭÒé-icmp) - * [·Ö×éÍø¼ä̽²â PING](#·Ö×éÍø¼ä̽²â-ping) - * [IP ¶à²¥](#ip-¶à²¥) - * [ÐéÄâרÓÃÍø VPN](#ÐéÄâרÓÃÍø-vpn) - * [ÍøÂçµØÖ·×ª»» NAT](#ÍøÂçµØÖ·×ª»»-nat) -* [µÚÎåÕ ÔËÊä²ã*](#µÚÎåÕÂ-ÔËÊä²ã) - * [UDP ºÍ TCP µÄÌØµã](#udp-ºÍ-tcp-µÄÌØµã) - * [UDP Êײ¿¸ñʽ](#udp-Êײ¿¸ñʽ) - * [TCP Êײ¿¸ñʽ](#tcp-Êײ¿¸ñʽ) - * [TCP µÄÈý´ÎÎÕÊÖ](#tcp-µÄÈý´ÎÎÕÊÖ) - * [TCP µÄËĴλÓÊÖ](#tcp-µÄËĴλÓÊÖ) - * [TCP »¬¶¯´°¿Ú](#tcp-»¬¶¯´°¿Ú) - * [TCP ¿É¿¿´«Êä](#tcp-¿É¿¿´«Êä) - * [TCP Á÷Á¿¿ØÖÆ](#tcp-Á÷Á¿¿ØÖÆ) - * [TCP ÓµÈû¿ØÖÆ](#tcp-ÓµÈû¿ØÖÆ) - * [Âý¿ªÊ¼ÓëÓµÈû±ÜÃâ](#Âý¿ªÊ¼ÓëÓµÈû±ÜÃâ) - * [¿ìÖØ´«Óë¿ì»Ö¸´](#¿ìÖØ´«Óë¿ì»Ö¸´) -* [µÚÁùÕ ӦÓòã*](#µÚÁùÕÂ-Ó¦Óòã) - * [ÓòÃûϵͳ DNS](#ÓòÃûϵͳ-dns) - * [1. ²ã´Î½á¹¹](#1-²ã´Î½á¹¹) - * [2. ½âÎö¹ý³Ì](#2-½âÎö¹ý³Ì) - * [Îļþ´«ÊäЭÒé FTP](#Îļþ´«ÊäЭÒé-ftp) - * [Ô¶³ÌÖÕ¶ËЭÒé TELNET](#Ô¶³ÌÖÕ¶ËЭÒé-telnet) - * [ÍòÎ¬Íø WWW](#ÍòÎ¬Íø-www) - * [µç×ÓÓʼþЭÒé](#µç×ÓÓʼþЭÒé) + * [互è�”网的组æˆ�](#互è�”网的组æˆ�) + * [主机之间的通信方å¼�](#主机之间的通信方å¼�) + * [电路交æ�¢ä¸Žåˆ†ç»„交æ�¢](#电路交æ�¢ä¸Žåˆ†ç»„交æ�¢) + * [1. 电路交æ�¢](#1-电路交æ�¢) + * [2. 报文交æ�¢](#2-报文交æ�¢) + * [3. 分组交æ�¢](#3-分组交æ�¢) + * [æ—¶å»¶](#æ—¶å»¶) + * [1. å�‘é€�æ—¶å»¶](#1-å�‘é€�æ—¶å»¶) + * [2. ä¼ æ’­æ—¶å»¶](#2-ä¼ æ’­æ—¶å»¶) + * [3. 处ç�†æ—¶å»¶](#3-处ç�†æ—¶å»¶) + * [4. 排队时延](#4-排队时延) + * [计算机网络体系结构*](#计算机网络体系结构) + * [1. 七层å��è®®](#1-七层å��è®®) + * [2. 五层å��è®®](#2-五层å��è®®) + * [3. æ•°æ�®åœ¨å�„层之间的传递过程](#3-æ•°æ�®åœ¨å�„层之间的传递过程) + * [4. TCP/IP 体系结构](#4-tcpip-体系结构) +* [第二章 物ç�†å±‚](#第二章-物ç�†å±‚) + * [通信方å¼�](#通信方å¼�) + * [带通调制](#带通调制) + * [ä¿¡é�“å¤�用技术](#ä¿¡é�“å¤�用技术) + * [1. 频分å¤�用ã€�时分å¤�用](#1-频分å¤�用时分å¤�用) + * [2. 统计时分å¤�用](#2-统计时分å¤�用) + * [3. 波分å¤�用](#3-波分å¤�用) + * [4. ç �分å¤�用](#4-ç �分å¤�用) +* [第三章 æ•°æ�®é“¾è·¯å±‚](#第三章-æ•°æ�®é“¾è·¯å±‚) + * [三个基本问题](#三个基本问题) + * [1. å°�装æˆ�帧](#1-å°�装æˆ�帧) + * [2. é€�明传输](#2-é€�明传输) + * [3. 差错检测](#3-差错检测) + * [点对点信é�“ - PPP å��è®®](#点对点信é�“---ppp-å��è®®) + * [局域网的拓扑](#局域网的拓扑) + * [广播信é�“ - CSMA/CD å��è®®*](#广播信é�“---csmacd-å��è®®) + * [集线器](#集线器) + * [MAC 层](#mac-层) + * [虚拟局域网](#虚拟局域网) +* [第四章 网络层*](#第四章-网络层) + * [网际å��è®® IP 概述](#网际å��è®®-ip-概述) + * [IP æ•°æ�®æŠ¥æ ¼å¼�](#ip-æ•°æ�®æŠ¥æ ¼å¼�) + * [IP 地å�€ç¼–å�€](#ip-地å�€ç¼–å�€) + * [1. 分类](#1-分类) + * [2. å­�网划分](#2-å­�网划分) + * [3. 无分类](#3-无分类) + * [IP 地å�€å’Œ MAC 地å�€](#ip-地å�€å’Œ-mac-地å�€) + * [地å�€è§£æž�å��è®® ARP](#地å�€è§£æž�å��è®®-arp) + * [路由器的结构](#路由器的结构) + * [交æ�¢æœºä¸Žè·¯ç”±å™¨çš„区别](#交æ�¢æœºä¸Žè·¯ç”±å™¨çš„区别) + * [路由器分组转å�‘æµ�程](#路由器分组转å�‘æµ�程) + * [路由选择å��è®®](#路由选择å��è®®) + * [1. 内部网关å��è®® RIP](#1-内部网关å��è®®-rip) + * [2. 内部网关å��è®® OSPF](#2-内部网关å��è®®-ospf) + * [3. 外部网关å��è®® BGP](#3-外部网关å��è®®-bgp) + * [网际控制报文å��è®® ICMP](#网际控制报文å��è®®-icmp) + * [分组网间探测 PING](#分组网间探测-ping) + * [IP 多播](#ip-多播) + * [虚拟专用网 VPN](#虚拟专用网-vpn) + * [网络地å�€è½¬æ�¢ NAT](#网络地å�€è½¬æ�¢-nat) +* [第五章 è¿�输层*](#第五章-è¿�输层) + * [UDP å’Œ TCP 的特点](#udp-å’Œ-tcp-的特点) + * [UDP 首部格å¼�](#udp-首部格å¼�) + * [TCP 首部格å¼�](#tcp-首部格å¼�) + * [TCP 的三次æ�¡æ‰‹](#tcp-的三次æ�¡æ‰‹) + * [TCP 的四次挥手](#tcp-的四次挥手) + * [TCP 滑动窗å�£](#tcp-滑动窗å�£) + * [TCP å�¯é� ä¼ è¾“](#tcp-å�¯é� ä¼ è¾“) + * [TCP æµ�é‡�控制](#tcp-æµ�é‡�控制) + * [TCP 拥塞控制](#tcp-拥塞控制) + * [慢开始与拥塞é�¿å…�](#慢开始与拥塞é�¿å…�) + * [å¿«é‡�传与快æ�¢å¤�](#å¿«é‡�传与快æ�¢å¤�) +* [第六章 应用层*](#第六章-应用层) + * [域å��系统 DNS](#域å��系统-dns) + * [1. 层次结构](#1-层次结构) + * [2. è§£æž�过程](#2-è§£æž�过程) + * [文件传输å��è®® FTP](#文件传输å��è®®-ftp) + * [远程终端å��è®® TELNET](#远程终端å��è®®-telnet) + * [万维网 WWW](#万维网-www) + * [电å­�邮件å��è®®](#电å­�邮件å��è®®) * [POP3](#pop3) * [IMAP](#imap) * [SMTP](#smtp) - * [¶¯Ì¬Ö÷»úÅäÖÃЭÒé DHCP](#¶¯Ì¬Ö÷»úÅäÖÃЭÒé-dhcp) - * [µã¶Ôµã´«Êä P2P](#µã¶Ôµã´«Êä-p2p) - * [Web Ò³ÃæÇëÇó¹ý³Ì](#web-Ò³ÃæÇëÇó¹ý³Ì) - * [³£Óö˿Ú](#³£Óö˿Ú) -* [²Î¿¼×ÊÁÏ](#²Î¿¼×ÊÁÏ) + * [动æ€�主机é…�ç½®å��è®® DHCP](#动æ€�主机é…�ç½®å��è®®-dhcp) + * [点对点传输 P2P](#点对点传输-p2p) + * [Web 页é�¢è¯·æ±‚过程](#web-页é�¢è¯·æ±‚过程) + * [常用端å�£](#常用端å�£) +* [å�‚考资料](#å�‚考资料) -# µÚÒ»Õ ¸ÅÊö +# 第一章 概述 -## ÍøÂçµÄÍøÂç +## 网络的网络 -ÍøÂç°ÑÖ÷»úÁ¬½ÓÆðÀ´£¬¶ø»¥ÁªÍøÊǰѶàÖÖ²»Í¬µÄÍøÂçÁ¬½ÓÆðÀ´£¬Òò´Ë»¥ÁªÍøÊÇÍøÂçµÄÍøÂç¡£ +网络把主机连接起æ�¥ï¼Œè€Œäº’è�”网是把多ç§�ä¸�å�Œçš„网络连接起æ�¥ï¼Œå› æ­¤äº’è�”网是网络的网络。 ![](https://github.com/CyC2018/InterviewNotes/blob/master/pics/04ff7ae6-7bee-4cf8-82f8-dfe2ba1f3616.jpg) ## ISP -»¥ÁªÍø·þÎñÌṩÉÌ ISP ¿ÉÒÔ´Ó»¥ÁªÍø¹ÜÀí»ú¹¹»ñµÃÐí¶à IP µØÖ·£¬Í¬Ê±ÓµÓÐͨÐÅÏß·ÒÔ¼°Â·ÓÉÆ÷µÈÁªÍøÉ豸£¬¸öÈË»ò»ú¹¹Ïò ISP ½ÉÄÉÒ»¶¨µÄ·ÑÓþͿÉÒÔ½ÓÈ뻥ÁªÍø¡£ +互è�”网æœ�务æ��供商 ISP å�¯ä»¥ä»Žäº’è�”网管ç�†æœºæž„获得许多 IP 地å�€ï¼Œå�Œæ—¶æ‹¥æœ‰é€šä¿¡çº¿è·¯ä»¥å�Šè·¯ç”±å™¨ç­‰è�”网设备,个人或机构å�‘ ISP 缴纳一定的费用就å�¯ä»¥æŽ¥å…¥äº’è�”网。 -ĿǰµÄ»¥ÁªÍøÊÇÒ»ÖÖ¶à²ã´Î ISP ½á¹¹£¬ISP ¸ù¾Ý¸²¸ÇÃæ»ýµÄ´óС·ÖΪÖ÷¸É ISP¡¢µØÇø ISP ºÍ±¾µØ ISP¡£ +ç›®å‰�的互è�”网是一ç§�多层次 ISP 结构,ISP æ ¹æ�®è¦†ç›–é�¢ç§¯çš„大å°�分为主干 ISPã€�地区 ISP 和本地 ISP。 -»¥ÁªÍø½»»»µã IXP ÔÊÐíÁ½¸ö ISP Ö±½ÓÏàÁ¬¶ø²»Óþ­¹ýµÚÈý¸ö ISP¡£ +互è�”网交æ�¢ç‚¹ IXP å…�许两个 ISP 直接相连而ä¸�用ç»�过第三个 ISP。 ![](https://github.com/CyC2018/InterviewNotes/blob/master/pics/17d807ef-03bf-4824-a97c-ea5fb58ec61d.jpg) -## »¥ÁªÍøµÄ×é³É +## 互è�”网的组æˆ� -1. ±ßÔµ²¿·Ö£ºËùÓÐÁ¬½ÓÔÚ»¥ÁªÍøÉϵÄÖ÷»ú£¬Óû§¿ÉÒÔÖ±½ÓʹÓã» -2. ºËÐIJ¿·Ö£ºÓÉ´óÁ¿µÄÍøÂçºÍÁ¬½ÓÕâÐ©ÍøÂçµÄ·ÓÉÆ÷×é³É£¬Îª±ßÔµ²¿·ÖµÄÖ÷»úÌṩ·þÎñ¡£ +1. 边缘部分:所有连接在互è�”网上的主机,用户å�¯ä»¥ç›´æŽ¥ä½¿ç”¨ï¼› +2. 核心部分:由大é‡�的网络和连接这些网络的路由器组æˆ�,为边缘部分的主机æ��ä¾›æœ�务。 ![](https://github.com/CyC2018/InterviewNotes/blob/master/pics/005d83c2-e64a-41f0-bbdd-51c71d494a18.jpg) -## Ö÷»úÖ®¼äµÄͨÐÅ·½Ê½ +## 主机之间的通信方å¼� -**1. ¿Í»§ - ·þÎñÆ÷£¨C/S£©** +**1. 客户 - æœ�务器(C/S)** -¿Í»§¼´ÊÇ·þÎñÇëÇó·½£¬·þÎñÆ÷ÊÇ·þÎñÌṩ·½¡£ +客户å�³æ˜¯æœ�务请求方,æœ�务器是æœ�务æ��供方。 -**2. ¶ÔµÈ£¨P2P£©** +**2. 对等(P2P)** -²»Çø·Ö¿Í»§ºÍ·þÎñÆ÷¡£ +ä¸�区分客户和æœ�务器。 -## µç·½»»»Óë·Ö×é½»»» +## 电路交æ�¢ä¸Žåˆ†ç»„交æ�¢ ![](https://github.com/CyC2018/InterviewNotes/blob/master/pics/b97958dd-3e43-45f7-97f5-3ec20f3f8b88.jpg) -### 1. µç·½»»» +### 1. 电路交æ�¢ -µç·½»»»ÓÃÓڵ绰ͨÐÅϵͳ£¬Á½¸öÓû§ÒªÍ¨ÐÅ֮ǰÐèÒª½¨Á¢Ò»ÌõרÓõÄÎïÀíÁ´Â·£¬²¢ÇÒÔÚÕû¸öͨÐŹý³ÌÖÐʼÖÕÕ¼ÓøÃÁ´Â·¡£ÓÉÓÚͨÐŵĹý³ÌÖв»¿ÉÄÜÒ»Ö±ÔÚʹÓô«ÊäÏß·£¬Òò´Ëµç·½»»»¶ÔÏß·µÄÀûÓÃÂʺܵͣ¬ÍùÍù²»µ½ 10%¡£ +电路交æ�¢ç”¨äºŽç”µè¯�通信系统,两个用户è¦�通信之å‰�需è¦�建立一æ�¡ä¸“用的物ç�†é“¾è·¯ï¼Œå¹¶ä¸”在整个通信过程中始终å� ç”¨è¯¥é“¾è·¯ã€‚由于通信的过程中ä¸�å�¯èƒ½ä¸€ç›´åœ¨ä½¿ç”¨ä¼ è¾“线路,因此电路交æ�¢å¯¹çº¿è·¯çš„利用率很低,往往ä¸�到 10%。 -### 2. ±¨ÎĽ»»» +### 2. 报文交æ�¢ -±¨ÎĽ»»»ÓÃÓÚÓʾÖͨÐÅϵͳ£¬ÓʾֽÓÊÕµ½Ò»·Ý±¨ÎÄÖ®ºó£¬ÏÈ´æ´¢ÏÂÀ´£¬È»ºó°ÑÏàͬĿµÄµØµÄ±¨ÎÄÒ»Æðת·¢µ½ÏÂÒ»¸öÄ¿µÄµØ£¬Õâ¸ö¹ý³Ì¾ÍÊǴ洢ת·¢¹ý³Ì¡£ +报文交æ�¢ç”¨äºŽé‚®å±€é€šä¿¡ç³»ç»Ÿï¼Œé‚®å±€æŽ¥æ”¶åˆ°ä¸€ä»½æŠ¥æ–‡ä¹‹å�Žï¼Œå…ˆå­˜å‚¨ä¸‹æ�¥ï¼Œç„¶å�ŽæŠŠç›¸å�Œç›®çš„地的报文一起转å�‘到下一个目的地,这个过程就是存储转å�‘过程。 -### 3. ·Ö×é½»»» +### 3. 分组交æ�¢ -·Ö×é½»»»Ò²Ê¹ÓÃÁ˴洢ת·¢£¬µ«ÊÇת·¢µÄÊÇ·Ö×é¶ø²»ÊDZ¨ÎÄ¡£°ÑÕû¿éÊý¾Ý³ÆÎªÒ»¸ö±¨ÎÄ£¬ÓÉÓÚÒ»¸ö±¨ÎÄ¿ÉÄܺܳ¤£¬ÐèÒªÏȽøÐÐÇз֣¬À´Âú×ã·Ö×éÄÜ´¦ÀíµÄ´óС¡£ÔÚÿ¸öÇзֵÄÊý¾ÝÇ°Ãæ¼ÓÉÏÊײ¿Ö®ºó¾Í³ÉΪÁË·Ö×飬Êײ¿°üº¬ÁËÄ¿µÄµØÖ·ºÍÔ´µØÖ·µÈ¿ØÖÆÐÅÏ¢¡£ +分组交æ�¢ä¹Ÿä½¿ç”¨äº†å­˜å‚¨è½¬å�‘,但是转å�‘的是分组而ä¸�是报文。把整å�—æ•°æ�®ç§°ä¸ºä¸€ä¸ªæŠ¥æ–‡ï¼Œç”±äºŽä¸€ä¸ªæŠ¥æ–‡å�¯èƒ½å¾ˆé•¿ï¼Œéœ€è¦�先进行切分,æ�¥æ»¡è¶³åˆ†ç»„能处ç�†çš„大å°�。在æ¯�个切分的数æ�®å‰�é�¢åŠ ä¸Šé¦–éƒ¨ä¹‹å�Žå°±æˆ�为了分组,首部包å�«äº†ç›®çš„地å�€å’Œæº�地å�€ç­‰æŽ§åˆ¶ä¿¡æ�¯ã€‚ ![](https://github.com/CyC2018/InterviewNotes/blob/master/pics/6f4af159-8b03-4246-8d0e-222db65bb83c.jpg) -´æ´¢×ª·¢ÔÊÐíÔÚÒ»Ìõ´«ÊäÏß·ÉÏ´«ËͶà¸öÖ÷»úµÄ·Ö×飬Òò´Ë²»ÐèÒªÕ¼Óö˵½¶ËµÄÏß·×ÊÔ´¡£ +存储转å�‘å…�许在一æ�¡ä¼ è¾“线路上传é€�多个主机的分组,因此ä¸�需è¦�å� ç”¨ç«¯åˆ°ç«¯çš„线路资æº�。 -Ïà±ÈÓÚ±¨ÎĽ»»»£¬ÓÉÓÚ·Ö×é±È±¨ÎĸüС£¬´æ´¢×ª·¢µÄËÙ¶ÈÒ²¾Í¸ü¿ì¡£ +相比于报文交æ�¢ï¼Œç”±äºŽåˆ†ç»„比报文更å°�,存储转å�‘的速度也就更快。 -## ʱÑÓ +## æ—¶å»¶ -×ÜʱÑÓ = ·¢ËÍʱÑÓ + ´«²¥Ê±ÑÓ + ´¦ÀíʱÑÓ + ÅŶÓʱÑÓ +总时延 = å�‘é€�æ—¶å»¶ + ä¼ æ’­æ—¶å»¶ + 处ç�†æ—¶å»¶ + 排队时延 ![](https://github.com/CyC2018/InterviewNotes/blob/master/pics/ceee91c2-da26-4169-94c3-e4608b46b9ac.png) -### 1. ·¢ËÍʱÑÓ +### 1. å�‘é€�æ—¶å»¶ -Ö÷»ú»ò·ÓÉÆ÷·¢ËÍÊý¾ÝÖ¡ËùÐèÒªµÄʱ¼ä¡£ +主机或路由器å�‘é€�æ•°æ�®å¸§æ‰€éœ€è¦�的时间。 ![](http://latex.codecogs.com/gif.latex?\\\\delay=\frac{l(bit)}{v(bit/s)}) -ÆäÖÐ l ±íʾÊý¾ÝÖ¡µÄ³¤¶È£¬v ±íʾ·¢ËÍËÙÂÊ¡£ +其中 l 表示数æ�®å¸§çš„长度,v 表示å�‘é€�速率。 -### 2. ´«²¥Ê±ÑÓ +### 2. ä¼ æ’­æ—¶å»¶ -µç´Å²¨ÔÚÐŵÀÖд«²¥Ò»¶¨µÄ¾àÀëÐèÒª»¨·ÑµÄʱ¼ä£¬µç´Å²¨´«²¥ËٶȽӽü¹âËÙ¡£ +电ç£�波在信é�“中传播一定的è·�离需è¦�花费的时间,电ç£�波传播速度接近光速。 ![](http://latex.codecogs.com/gif.latex?\\\\delay=\frac{l(m)}{v(m/s)}) -ÆäÖÐ l ±íʾÐŵÀ³¤¶È£¬v ±íʾµç´Å²¨ÔÚÐŵÀÉϵĴ«²¥ËÙÂÊ¡£ +其中 l 表示信é�“长度,v 表示电ç£�波在信é�“上的传播速率。 -### 3. ´¦ÀíʱÑÓ +### 3. 处ç�†æ—¶å»¶ -Ö÷»ú»ò·ÓÉÆ÷ÊÕµ½·Ö×éʱ½øÐд¦ÀíËùÐèÒªµÄʱ¼ä£¬ÀýÈç·ÖÎöÊײ¿£¬´Ó·Ö×éÖÐÌáÈ¡Êý¾Ý²¿·ÖµÈ¡£ +主机或路由器收到分组时进行处ç�†æ‰€éœ€è¦�的时间,例如分æž�首部,从分组中æ��å�–æ•°æ�®éƒ¨åˆ†ç­‰ã€‚ -### 4. ÅŶÓʱÑÓ +### 4. 排队时延 -·Ö×éÔÚ·ÓÉÆ÷µÄÊäÈë¶ÓÁкÍÊä³ö¶ÓÁÐÖÐÅŶӵȴýµÄʱ¼ä£¬È¡¾öÓÚÍøÂ統ǰµÄͨÐÅÁ¿¡£ +分组在路由器的输入队列和输出队列中排队等待的时间,å�–决于网络当å‰�的通信é‡�。 -## ¼ÆËã»úÍøÂçÌåϵ½á¹¹* +## 计算机网络体系结构* ![](https://github.com/CyC2018/InterviewNotes/blob/master/pics/1005dc9d-9049-4b06-9524-6171e56ebd8c.png) -### 1. Æß²ãЭÒé +### 1. 七层å��è®® -Èçͼ a Ëùʾ£¬ÆäÖбíʾ²ãºÍ»á»°²ãÓÃ;ÈçÏ£º +如图 a 所示,其中表示层和会è¯�层用途如下: -1. ±íʾ²ã£ºÐÅÏ¢µÄÓï·¨ÓïÒåÒÔ¼°ËüÃǵĹØÁª£¬Èç¼ÓÃܽâÃÜ¡¢×ª»»·­Ò롢ѹËõ½âѹËõ£» -2. »á»°²ã£º²»Í¬»úÆ÷ÉϵÄÓû§Ö®¼ä½¨Á¢¼°¹ÜÀí»á»°¡£ +1. 表示层:信æ�¯çš„语法语义以å�Šå®ƒä»¬çš„å…³è�”,如加密解密ã€�转æ�¢ç¿»è¯‘ã€�压缩解压缩; +2. 会è¯�层:ä¸�å�Œæœºå™¨ä¸Šçš„用户之间建立å�Šç®¡ç�†ä¼šè¯�。 -### 2. Îå²ãЭÒé +### 2. 五层å��è®® -1. Ó¦ÓÃ²ã£ºÎªÌØ¶¨Ó¦ÓóÌÐòÌṩÊý¾Ý´«Êä·þÎñ£¬ÀýÈç HTTP¡¢DNS µÈ¡£Êý¾Ýµ¥Î»Îª±¨ÎÄ¡£ +1. 应用层:为特定应用程åº�æ��供数æ�®ä¼ è¾“æœ�务,例如 HTTPã€�DNS 等。数æ�®å�•ä½�为报文。 -2. ÔËÊä²ã£ºÌṩµÄÊǽø³Ì¼äµÄͨÓÃÊý¾Ý´«Êä·þÎñ¡£ÓÉÓÚÓ¦ÓòãЭÒéºÜ¶à£¬¶¨ÒåͨÓõÄÔËÊä²ãЭÒé¾Í¿ÉÒÔÖ§³Ö²»¶ÏÔö¶àµÄÓ¦ÓòãЭÒé¡£ÔËÊä²ã°üÀ¨Á½ÖÖЭÒ飺´«Êä¿ØÖÆÐ­Òé TCP£¬Ìá¹©ÃæÏòÁ¬½Ó¡¢¿É¿¿µÄÊý¾Ý´«Êä·þÎñ£¬Êý¾Ýµ¥Î»Îª±¨ÎĶΣ»Óû§Êý¾Ý±¨Ð­Òé UDP£¬ÌṩÎÞÁ¬½Ó¡¢¾¡×î´óŬÁ¦µÄÊý¾Ý´«Êä·þÎñ£¬Êý¾Ýµ¥Î»ÎªÓû§Êý¾Ý±¨¡£ +2. è¿�输层:æ��供的是进程间的通用数æ�®ä¼ è¾“æœ�务。由于应用层å��议很多,定义通用的è¿�输层å��议就å�¯ä»¥æ”¯æŒ�ä¸�断增多的应用层å��议。è¿�输层包括两ç§�å��议:传输控制å��è®® TCP,æ��ä¾›é�¢å�‘连接ã€�å�¯é� çš„æ•°æ�®ä¼ è¾“æœ�务,数æ�®å�•ä½�为报文段;用户数æ�®æŠ¥å��è®® UDP,æ��供无连接ã€�尽最大努力的数æ�®ä¼ è¾“æœ�务,数æ�®å�•ä½�为用户数æ�®æŠ¥ã€‚**TCP主è¦�æ��供完整性æœ�务,UDP主è¦�æ��ä¾›å�Šæ—¶æ€§æœ�务** -3. ÍøÂç²ã£ºÎªÖ÷»úÖ®¼äÌṩ·þÎñ£¬¶ø²»ÊÇÏñÔËÊä²ãЭÒéÄÇÑùÊÇΪÖ÷»úÖеĽø³ÌÌṩ·þÎñ¡£ÍøÂç²ã°ÑÔËÊä²ã²úÉúµÄ±¨ÎĶλòÕßÓû§Êý¾Ý±¨·â×°³É·Ö×éÀ´½øÐд«Êä¡£ +3. 网络层:为主机之间æ��ä¾›æœ�务,而ä¸�是åƒ�è¿�输层å��议那样是为主机中的进程æ��ä¾›æœ�务。网络层把è¿�输层产生的报文段或者用户数æ�®æŠ¥å°�装æˆ�分组æ�¥è¿›è¡Œä¼ è¾“。 -4. Êý¾ÝÁ´Â·²ã£ºÍøÂç²ãÕë¶ÔµÄ»¹ÊÇÖ÷»úÖ®¼ä£¬¶øÖ÷»úÖ®¼ä¿ÉÒÔÓкܶàÁ´Â·£¬Á´Â·²ãЭÒé¾ÍÊÇΪÏàÁÚ½áµãÖ®¼äÌṩ·þÎñ¡£Êý¾ÝÁ´Â·²ã°ÑÍøÂç²ã´«À´µÄ·Ö×é·â×°³ÉÖ¡¡£ +4. æ•°æ�®é“¾è·¯å±‚:网络层针对的还是主机之间,而主机之间å�¯ä»¥æœ‰å¾ˆå¤šé“¾è·¯ï¼Œé“¾è·¯å±‚å��议就是为相邻结点之间æ��ä¾›æœ�务。数æ�®é“¾è·¯å±‚把网络层传æ�¥çš„分组å°�装æˆ�帧。 -5. ÎïÀí²ã£º¿¼ÂǵÄÊÇÔõÑùÔÚ´«ÊäýÌåÉÏ´«ÊäÊý¾Ý±ÈÌØÁ÷£¬¶ø²»ÊÇÖ¸¾ßÌåµÄ´«ÊäýÌå¡£ÎïÀí²ãµÄ×÷ÓÃÊǾ¡¿ÉÄÜÆÁ±Î´«ÊäýÌåºÍͨÐÅÊֶεIJîÒ죬ʹÎïÀí²ãÉϵÄÊý¾ÝÁ´Â·²ã¸Ð¾õ²»µ½ÕâЩ²îÒì¡£ +5. 物ç�†å±‚:考虑的是怎样在传输媒体上传输数æ�®æ¯”特æµ�,而ä¸�是指具体的传输媒体。物ç�†å±‚的作用是尽å�¯èƒ½å±�蔽传输媒体和通信手段的差异,使物ç�†å±‚上的数æ�®é“¾è·¯å±‚感觉ä¸�到这些差异。 -### 3. Êý¾ÝÔÚ¸÷²ãÖ®¼äµÄ´«µÝ¹ý³Ì +### 3. æ•°æ�®åœ¨å�„层之间的传递过程 -ÔÚÏòϵĹý³ÌÖУ¬ÐèÒªÌí¼ÓϲãЭÒéËùÐèÒªµÄÊײ¿»òÕßβ²¿£¬¶øÔÚÏòÉϵĹý³ÌÖв»¶Ï²ð¿ªÊײ¿ºÍβ²¿¡£ +在å�‘下的过程中,需è¦�添加下层å��议所需è¦�的首部或者尾部,而在å�‘上的过程中ä¸�断拆开首部和尾部。 -·ÓÉÆ÷Ö»ÓÐÏÂÃæÈý²ãЭÒ飬ÒòΪ·ÓÉÆ÷λÓÚÍøÂçºËÐÄÖУ¬²»ÐèҪΪ½ø³Ì»òÕßÓ¦ÓóÌÐòÌṩ·þÎñ£¬Òò´ËÒ²¾Í²»ÐèÒªÔËÊä²ãºÍÓ¦Óò㡣 +路由器å�ªæœ‰ä¸‹é�¢ä¸‰å±‚å��议,因为路由器ä½�于网络核心中,ä¸�需è¦�为进程或者应用程åº�æ��ä¾›æœ�务,因此也就ä¸�需è¦�è¿�输层和应用层。 ![](https://github.com/CyC2018/InterviewNotes/blob/master/pics/f7d5da89-2d75-4d8f-85e7-6b608865dc00.jpg) -### 4. TCP/IP Ìåϵ½á¹¹ +### 4. TCP/IP 体系结构 -ËüÖ»ÓÐËIJ㣬Ï൱ÓÚÎå²ãЭÒéÖÐÊý¾ÝÁ´Â·²ãºÍÎïÀí²ãºÏ²¢ÎªÍøÂç½Ó¿Ú²ã¡£ +它å�ªæœ‰å››å±‚,相当于五层å��议中数æ�®é“¾è·¯å±‚和物ç�†å±‚å�ˆå¹¶ä¸ºç½‘络接å�£å±‚。 -ÏÖÔÚµÄ TCP/IP Ìåϵ½á¹¹²»Ñϸñ×ñÑ­ OSI ·Ö²ã¸ÅÄӦÓòã¿ÉÄÜ»áÖ±½ÓʹÓà IP ²ã»òÕßÍøÂç½Ó¿Ú²ã¡£ +现在的 TCP/IP 体系结构ä¸�严格é�µå¾ª OSI 分层概念,应用层å�¯èƒ½ä¼šç›´æŽ¥ä½¿ç”¨ IP 层或者网络接å�£å±‚。 ![](https://github.com/CyC2018/InterviewNotes/blob/master/pics/3e2200b3-1c18-4853-ae42-7788e8e1f939.png) -TCP/IP ЭÒé×åÊÇÒ»ÖÖɳ©ÐÎ×´£¬ÖмäСÁ½±ß´ó£¬IP ЭÒéÔÚÆäÖÐÕ¼ÓþÙ×ãÇáÖØµÄµØÎ»¡£ +TCP/IP å��è®®æ—�是一ç§�æ²™æ¼�形状,中间å°�两边大,IP å��议在其中å� ç”¨ä¸¾è¶³è½»é‡�的地ä½�。 ![](https://github.com/CyC2018/InterviewNotes/blob/master/pics/9ecaebee-670e-4cb2-9cdb-3029c00f33bd.png) +### è�Œæ–°ç–‘问: +1. 光纤传输,为什么ä¸�å�Œå…‰çº¤ç½‘速会有差别?答:光是信æ�¯çš„载体,光的数é‡�决定传输信æ�¯çš„æ•°é‡�。 +# 第二章 物ç�†å±‚ -# µÚ¶þÕ ÎïÀí²ã +## 通信方å¼� -## ͨÐÅ·½Ê½ +1. å�•å�‘通信,å�ˆç§°ä¸ºå�•工通信; +2. å�Œå�‘交替通信,å�ˆç§°ä¸ºå�Šå�Œå·¥é€šä¿¡ï¼› +3. å�Œå�‘å�Œæ—¶é€šä¿¡ï¼Œå�ˆç§°ä¸ºå…¨å�Œå·¥é€šä¿¡ã€‚ -1. µ¥ÏòͨÐÅ£¬ÓÖ³ÆÎªµ¥¹¤Í¨ÐÅ£» -2. Ë«Ïò½»ÌæÍ¨ÐÅ£¬ÓÖ³ÆÎª°ëË«¹¤Í¨ÐÅ£» -3. Ë«ÏòͬʱͨÐÅ£¬ÓÖ³ÆÎªÈ«Ë«¹¤Í¨ÐÅ¡£ +## 带通调制 -## ´øÍ¨µ÷ÖÆ - -Ä£ÄâÐźÅÊÇÁ¬ÐøµÄÐźţ¬Êý×ÖÐźÅÊÇÀëÉ¢µÄÐźš£´øÍ¨µ÷ÖÆ°ÑÊý×ÖÐźÅת»»ÎªÄ£ÄâÐźš£ +模拟信å�·æ˜¯è¿žç»­çš„ä¿¡å�·ï¼Œæ•°å­—ä¿¡å�·æ˜¯ç¦»æ•£çš„ä¿¡å�·ã€‚带通调制把数字信å�·è½¬æ�¢ä¸ºæ¨¡æ‹Ÿä¿¡å�·ã€‚ ![](https://github.com/CyC2018/InterviewNotes/blob/master/pics/d2c55c84-aa1f-43c1-bd97-457bcb7816b3.png) -## ÐŵÀ¸´Óü¼Êõ +## ä¿¡é�“å¤�用技术 -### 1. Ƶ·Ö¸´Óá¢Ê±·Ö¸´Óà +### 1. 频分å¤�用ã€�时分å¤�用 -Ƶ·Ö¸´ÓõÄËùÓÐÓû§ÔÚÏàͬµÄʱ¼äÕ¼Óò»Í¬µÄƵÂÊ´ø¿í×ÊÔ´£»Ê±·Ö¸´ÓõÄËùÓÐÓû§ÔÚ²»Í¬µÄʱ¼äÕ¼ÓÃÏàͬµÄƵÂÊ´ø¿í×ÊÔ´¡£ +频分å¤�用的所有用户在相å�Œçš„æ—¶é—´å� ç”¨ä¸�å�Œçš„频率带宽资æº�;时分å¤�用的所有用户在ä¸�å�Œçš„æ—¶é—´å� ç”¨ç›¸å�Œçš„频率带宽资æº�。 -ʹÓÃÕâÁ½ÖÖ·½Ê½½øÐÐͨÐÅ£¬ÔÚͨÐŵĹý³ÌÖÐÓû§»áÒ»Ö±Õ¼ÓÃÒ»²¿·ÖÐŵÀ×ÊÔ´¡£µ«ÊÇÓÉÓÚ¼ÆËã»úÊý¾ÝµÄÍ»·¢ÐÔÖÊ£¬Ã»±ØÒªÒ»Ö±Õ¼ÓÃÐŵÀ×ÊÔ´¶ø²»Èóö¸øÆäËüÓû§Ê¹Óã¬Òò´ËÕâÁ½ÖÖ·½Ê½¶ÔÐŵÀµÄÀûÓÃÂʶ¼²»¸ß¡£ +使用这两ç§�æ–¹å¼�进行通信,在通信的过程中用户会一直å� ç”¨ä¸€éƒ¨åˆ†ä¿¡é�“资æº�。但是由于计算机数æ�®çš„çª�å�‘性质,没必è¦�一直å� ç”¨ä¿¡é�“资æº�而ä¸�让出给其它用户使用,因此这两ç§�æ–¹å¼�对信é�“的利用率都ä¸�高。 ![](https://github.com/CyC2018/InterviewNotes/blob/master/pics/543d47a1-f0dd-414f-b23c-0c142c814854.png) -### 2. ͳ¼ÆÊ±·Ö¸´Óà +### 2. 统计时分å¤�用 -ÊǶÔʱ·Ö¸´ÓõÄÒ»ÖָĽø£¬²»¹Ì¶¨Ã¿¸öÓû§ÔÚʱ·Ö¸´ÓÃÖ¡ÖеÄλÖã¬Ö»ÒªÓÐÊý¾Ý¾Í¼¯ÖÐÆðÀ´×é³Éʱ·Ö¸´ÓÃÖ¡È»ºó·¢ËÍ¡£ +是对时分å¤�用的一ç§�改进,ä¸�固定æ¯�个用户在时分å¤�用帧中的ä½�置,å�ªè¦�有数æ�®å°±é›†ä¸­èµ·æ�¥ç»„æˆ�时分å¤�用帧然å�Žå�‘é€�。 ![](https://github.com/CyC2018/InterviewNotes/blob/master/pics/29058e09-bb72-4040-a73d-4c497895e9ce.jpg) -### 3. ²¨·Ö¸´Óà +### 3. 波分å¤�用 -¹âµÄƵ·Ö¸´Óá£ÓÉÓÚ¹âµÄƵÂʺܸߣ¬Òò´Ëϰ¹ßÉÏÓò¨³¤¶ø²»ÊÇÆµÂÊÀ´±íʾËùʹÓõĹâÔØ²¨¡£ +光的频分å¤�用。由于光的频率很高,因此习惯上用波长而ä¸�是频率æ�¥è¡¨ç¤ºæ‰€ä½¿ç”¨çš„光载波。 ![](https://github.com/CyC2018/InterviewNotes/blob/master/pics/78534153-88d1-4f83-a6e0-59064dbdc43a.png) -### 4. Âë·Ö¸´Óà +### 4. ç �分å¤�用 -Ϊÿ¸öÓû§·ÖÅä m bit µÄÂëÆ¬£¬²¢ÇÒËùÓеÄÂëÆ¬Õý½»£¬¶ÔÓÚÈÎÒâÁ½¸öÂëÆ¬ $\vec{S}$ ºÍ $\vec{T}$ ÓÐ +为æ¯�个用户分é…� m bit çš„ç �片,并且所有的ç �片正交,对于任æ„�两个ç �片 $\vec{S}$ å’Œ $\vec{T}$ 有 ![](http://latex.codecogs.com/gif.latex?\\\\\vec{S}\cdot\vec{T}=0) -ΪÁË·½±ã£¬È¡ m=8£¬ÉèÂëÆ¬ $\vec{S}$ Ϊ 00011011¡£ÔÚÓµÓиÃÂëÆ¬µÄÓû§·¢ËͱÈÌØ 1 ʱ¾Í·¢Ë͸ÃÂëÆ¬£¬·¢ËͱÈÌØ 0 ʱ¾Í·¢Ë͸ÃÂëÆ¬µÄ·´Âë 11100100¡£ +为了方便,å�– m=8,设ç �片 $\vec{S}$ 为 00011011。在拥有该ç �片的用户å�‘é€�比特 1 æ—¶å°±å�‘é€�该ç �片,å�‘é€�比特 0 æ—¶å°±å�‘é€�该ç �片的å��ç � 11100100。 -ÔÚ¼ÆËãʱ½« 00011011 ¼Ç×÷ (-1 -1 -1 +1 +1 -1 +1 +1)£¬¿ÉÒԵõ½ +在计算时将 00011011 记作 (-1 -1 -1 +1 +1 -1 +1 +1),å�¯ä»¥å¾—到 ![](http://latex.codecogs.com/gif.latex?\\\\\frac{1}{m}\vec{S}\cdot\vec{S}=1) ![](http://latex.codecogs.com/gif.latex?\\\\\frac{1}{m}\vec{S}\cdot\vec{S'}=-1) -ÆäÖÐ $\vec{S'}$ Ϊ $\vec{S}$ µÄ·´Âë¡£ +其中 $\vec{S'}$ 为 $\vec{S}$ çš„å��ç �。 -ÀûÓÃÉÏÃæµÄʽ×ÓÎÒÃÇÖªµÀ£¬µ±½ÓÊÕ¶ËʹÓÃÂëÆ¬ $\vec{S}$ ¶Ô½ÓÊÕµ½µÄÊý¾Ý½øÐÐÄÚ»ýÔËËãʱ£¬½á¹ûΪ 0 µÄÊÇÆäËüÓû§·¢Ë͵ÄÊý¾Ý£¬½á¹ûΪ 1 µÄÊÇÓû§·¢Ë͵ıÈÌØ 1£¬½á¹ûΪ -1 µÄÊÇÓû§·¢Ë͵ıÈÌØ 0¡£ +利用上é�¢çš„å¼�å­�我们知é�“,当接收端使用ç �片 $\vec{S}$ 对接收到的数æ�®è¿›è¡Œå†…积è¿�算时,结果为 0 的是其它用户å�‘é€�的数æ�®ï¼Œç»“果为 1 的是用户å�‘é€�的比特 1,结果为 -1 的是用户å�‘é€�的比特 0。 -Âë·Ö¸´ÓÃÐèÒª·¢Ë͵ÄÊý¾ÝÁ¿ÎªÔ­Ï鵀 m ±¶¡£ +ç �分å¤�用需è¦�å�‘é€�的数æ�®é‡�为原先的 m å€�。 ![](https://github.com/CyC2018/InterviewNotes/blob/master/pics/0042edad-8e3b-4279-bd93-6906fcd1b640.jpg) -# µÚÈýÕ Êý¾ÝÁ´Â·²ã +# 第三章 æ•°æ�®é“¾è·¯å±‚ -## Èý¸ö»ù±¾ÎÊÌâ +## 三个基本问题 -### 1. ·â×°³ÉÖ¡ +### 1. å°�装æˆ�帧 -½«ÍøÂç²ã´«ÏÂÀ´µÄ·Ö×éÌí¼ÓÊײ¿ºÍβ²¿£¬ÓÃÓÚ±ê¼ÇÖ¡µÄ¿ªÊ¼ºÍ½áÊø¡£ +将网络层传下æ�¥çš„分组添加首部和尾部,用于标记帧的开始和结æ�Ÿã€‚ ![](https://github.com/CyC2018/InterviewNotes/blob/master/pics/ea5ed9b2-6d9f-48fb-b890-0288caf9088a.jpg) -### 2. ͸Ã÷´«Êä +### 2. é€�明传输 -͸Ã÷±íʾһ¸öʵ¼Ê´æÔÚµÄÊÂÎï¿´ÆðÀ´ºÃÏñ²»´æÔÚÒ»Ñù¡£ +é€�明表示一个实际存在的事物看起æ�¥å¥½åƒ�ä¸�存在一样。 -Ö¡ÖÐÓÐÊײ¿ºÍβ²¿£¬Èç¹ûÖ¡µÄÊý¾Ý²¿·Öº¬ÓкÍÊײ¿Î²²¿ÏàͬµÄÄÚÈÝ£¬ÄÇô֡µÄ¿ªÊ¼ºÍ½áÊøÎ»Öþͻᱻ´íÎóµÄÅж¨¡£ÐèÒªÔÚÊý¾ÝÖгöÏÖÊײ¿Î²²¿ÏàͬµÄÄÚÈÝÇ°Ãæ²åÈëתÒå×Ö·û£¬Èç¹ûÐèÒª´«ÊäµÄÄÚÈÝÕýºÃ¾ÍÊÇתÒå×Ö·û£¬ÄÇô¾ÍÔÚתÒå×Ö·ûÇ°ÃæÔÙ¼Ó¸öתÒå×Ö·û£¬ÔÚ½ÓÊն˽øÐд¦ÀíÖ®ºó¿ÉÒÔ»¹Ô­³öԭʼÊý¾Ý¡£Õâ¸ö¹ý³Ì͸Ã÷´«ÊäµÄÄÚÈÝÊÇתÒå×Ö·û£¬Óû§²ì¾õ²»µ½×ªÒå×Ö·ûµÄ´æÔÚ¡£ +帧中有首部和尾部,如果帧的数æ�®éƒ¨åˆ†å�«æœ‰å’Œé¦–部尾部相å�Œçš„内容,那么帧的开始和结æ�Ÿä½�置就会被错误的判定。需è¦�在数æ�®ä¸­å‡ºçŽ°é¦–éƒ¨å°¾éƒ¨ç›¸å�Œçš„内容å‰�é�¢æ�’入转义字符,如果需è¦�传输的内容正好就是转义字符,那么就在转义字符å‰�é�¢å†�加个转义字符,在接收端进行处ç�†ä¹‹å�Žå�¯ä»¥è¿˜åŽŸå‡ºåŽŸå§‹æ•°æ�®ã€‚这个过程é€�明传输的内容是转义字符,用户察觉ä¸�到转义字符的存在。 ![](https://github.com/CyC2018/InterviewNotes/blob/master/pics/44e1d90e-3fe6-4dd6-8dce-6daab12e7663.jpg) -### 3. ²î´í¼ì²â +### 3. 差错检测 -ĿǰÊý¾ÝÁ´Â·²ã¹ã·ºÊ¹ÓÃÁËÑ­»·ÈßÓà¼ìÑ飨CRC£©À´¼ì²é±ÈÌØ²î´í¡£ +ç›®å‰�æ•°æ�®é“¾è·¯å±‚广泛使用了循环冗余检验(CRC)æ�¥æ£€æŸ¥æ¯”特差错。widely used in 802.11 Wifi ATM ,Ethernet. -## µã¶ÔµãÐŵÀ - PPP ЭÒé +注æ„�差错检验ä¸�是100%å�¯é� ã€‚ -»¥ÁªÍøÓû§Í¨³£ÐèÒªÁ¬½Óµ½Ä³¸ö ISP Ö®ºó²ÅÄܽÓÈëµ½»¥ÁªÍø£¬PPP ЭÒé¾ÍÊÇÓû§¼ÆËã»úºÍ ISP ½øÐÐͨÐÅʱËùʹÓõÄÊý¾ÝÁ´Â·²ãЭÒé¡£ +除了CRC,还有的检验方法比如: +#### 奇å�¶æ ¡éªŒ +添加1ä½�使1çš„ä½�数为奇数或å�¶æ•° + +更进一步的方法**二维奇å�¶æ ¡éªŒ**,ä¸�但å�¯ä»¥æ£€é”™è¿˜å�¯ä»¥çº é”™éƒ¨åˆ†é”™è¯¯ +#### 检验和方法 +具体å�‚考UDP检验和计算方法判断 + +## 点对点信é�“ - PPP å��è®® + +互è�”网用户通常需è¦�连接到æŸ�个 ISP 之å�Žæ‰�能接入到互è�”网,PPP å��议就是用户计算机和 ISP 进行通信时所使用的数æ�®é“¾è·¯å±‚å��议。 ![](https://github.com/CyC2018/InterviewNotes/blob/master/pics/8b5bd2c8-8425-4a8b-89db-235c95800de9.jpg) -ÔÚ PPP µÄÖ¡ÖУ¬F ×Ö¶ÎΪ֡µÄ¶¨½ç·û£¬A ºÍ C ÔÝʱûÓÐÒâÒå¡£FCS ÊÇʹÓà CRC µÄ¼ìÑéÐòÁС£ÐÅÏ¢²¿·ÖµÄ³¤¶È²»³¬¹ý 1500¡£ +在 PPP 的帧中,F 字段为帧的定界符,A å’Œ C 暂时没有æ„�义。FCS 是使用 CRC 的检验åº�列。信æ�¯éƒ¨åˆ†çš„长度ä¸�超过 1500。 ![](https://github.com/CyC2018/InterviewNotes/blob/master/pics/a5fa89e7-54b9-4e2f-8c48-a35712d7b2f5.jpg) -## ¾ÖÓòÍøµÄÍØÆË +## 局域网的拓扑 ![](https://github.com/CyC2018/InterviewNotes/blob/master/pics/8b15e36f-69b4-46b6-a07c-7234ac7c7927.jpg) -## ¹ã²¥ÐŵÀ - CSMA/CD ЭÒé* +## Media Access Control +媒体访问控制 +主è¦�处ç�†å¯¹äºŽ1个链路上多个节点的访问 -Ôڹ㲥ÐŵÀÉÏ£¬Í¬Ò»Ê±¼äÖ»ÄÜÔÊÐíһ̨¼ÆËã»ú·¢ËÍÊý¾Ý¡£ +### 多路访问控制 +- ä¿¡é�“划分 +- è½®æµ� +- éš�机接入 +éš�机访问有Slotted ALOHA(最大效率0.37),ALOHA(最大效率时隙ALOHAçš„1å�Š)å’ŒCSMA/CD +## 广播信é�“ - CSMA/CD å��è®®* -CSMA/CD ±íÊ¾ÔØ²¨¼àÌý¶àµã½ÓÈë / Åöײ¼ì²â¡£ +在广播信é�“上,å�Œä¸€æ—¶é—´å�ªèƒ½å…�许一å�°è®¡ç®—机å�‘é€�æ•°æ�®ã€‚ -- **¶àµã½ÓÈë**£ºËµÃ÷ÕâÊÇ×ÜÏßÐÍÍøÂ磬Ðí¶à¼ÆËã»úÒÔ¶àµãµÄ·½Ê½Á¬½Óµ½×ÜÏßÉÏ¡£ -- **ÔØ²¨¼àÌý**£ºÃ¿¸öÕ¾¶¼±ØÐ벻ͣµØ¼ìÌýÐŵÀ¡£ÔÚ·¢ËÍǰ£¬Èç¹û¼ìÌýÐŵÀÕýÔÚʹÓ㬾ͱØÐëµÈ´ý¡£ -- **Åöײ¼ì²â**£ºÔÚ·¢ËÍÖУ¬Èç¹û¼ìÌýÐŵÀÒÑÓÐÆäËüÕ¾ÕýÔÚ·¢ËÍÊý¾Ý£¬¾Í±íʾ·¢ÉúÁËÅöײ¡£ËäȻÿһ¸öÕ¾ÔÚ·¢ËÍÊý¾Ý֮ǰ¶¼ÒѾ­¼ìÌýÐŵÀΪ¿ÕÏУ¬µ«ÊÇÓÉÓÚµç´Å²¨µÄ´«²¥Ê±ÑӵĴæÔÚ£¬»¹ÊÇÓпÉÄܻᷢÉúÅöײ¡£ +CSMA/CD 表示载波监å�¬å¤šç‚¹æŽ¥å…¥ / 碰撞检测。 + +- **多点接入**:说明这是总线型网络,许多计算机以多点的方å¼�连接到总线上。 +- **载波监å�¬**:æ¯�个站都必须ä¸�å�œåœ°æ£€å�¬ä¿¡é�“。在å�‘é€�å‰�,如果检å�¬ä¿¡é�“正在使用,就必须等待。 +- **碰撞检测**:在å�‘é€�中,如果检å�¬ä¿¡é�“已有其它站正在å�‘é€�æ•°æ�®ï¼Œå°±è¡¨ç¤ºå�‘生了碰撞。虽然æ¯�一个站在å�‘é€�æ•°æ�®ä¹‹å‰�都已ç»�检å�¬ä¿¡é�“为空闲,但是由于电ç£�波的传播时延的存在,还是有å�¯èƒ½ä¼šå�‘生碰撞。 ![](https://github.com/CyC2018/InterviewNotes/blob/master/pics/f9ed4da5-0032-41e6-991a-36d995ec28fd.png) -¼Ç¶Ëµ½¶ËµÄ´«²¥Ê±ÑÓΪ ¦Ó£¬×îÏÈ·¢Ë͵ÄÕ¾µã×î¶à¾­¹ý 2¦Ó ¾Í¿ÉÒÔÖªµÀÊÇ·ñ·¢ÉúÁËÅöײ£¬³Æ 2¦Ó Ϊ **ÕùÓÃÆÚ**¡£Ö»Óо­¹ýÕùÓÃÆÚÖ®ºó»¹Ã»Óмì²âµ½Åöײ£¬²ÅÄܿ϶¨Õâ´Î·¢ËͲ»»á·¢ÉúÅöײ¡£ +记端到端的传播时延为 τ,最先å�‘é€�的站点最多ç»�过 2Ï„ å°±å�¯ä»¥çŸ¥é�“是å�¦å�‘生了碰撞,称 2Ï„ 为 **争用期**。å�ªæœ‰ç»�过争用期之å�Žè¿˜æ²¡æœ‰æ£€æµ‹åˆ°ç¢°æ’žï¼Œæ‰�能肯定这次å�‘é€�ä¸�会å�‘生碰撞。 -µ±·¢ÉúÅöײʱ£¬Õ¾µãҪֹͣ·¢ËÍ£¬µÈ´ýÒ»¶Îʱ¼äÔÙ·¢ËÍ¡£Õâ¸öʱ¼ä²ÉÓà **½Ø¶Ï¶þ½øÖÆÖ¸ÊýÍ˱ÜËã·¨** À´È·¶¨£¬´ÓÀëÉ¢µÄÕûÊý¼¯ºÏ {0, 1, .., (2k-1)} ÖÐËæ»úÈ¡³öÒ»¸öÊý£¬¼Ç×÷ r£¬È»ºóÈ¡ r ±¶µÄÕùÓÃÆÚ×÷ÎªÖØ´«µÈ´ýʱ¼ä¡£ +当第k次å�‘生碰撞时,站点è¦�å�œæ­¢å�‘é€�,等待一段时间å†�å�‘é€�。这个时间采用 **截断二进制指数退é�¿ç®—法** æ�¥ç¡®å®šï¼Œä»Žç¦»æ•£çš„æ•´æ•°é›†å�ˆ {0, 1, .., (2k-1)} 中éš�机å�–出一个数,记作 r,然å�Žå�– r*512bit 的传输时间作为é‡�传等待时间。 +### è�Œæ–°ç–‘é—® +1. 计算机如何监å�¬åˆ°ç¢°æ’žï¼Ÿ -## ¼¯Ï߯÷ +ç�†è§£ï¼šå¹¿æ’­é€šä¿¡ä¸­ç”µç£�波以一定电场强度传播,当é�‡åˆ°å¯¹æ–¹ä¼ è¾“æ•°æ�®ï¼Œå·±æ–¹æŽ¥æ”¶å™¨ä¼šå�‘现干扰(类比机械波的干涉,振幅改å�˜ï¼Œç”µç£�波没有振幅) +## 集线器 -´Ó±íÃæÉÏ¿´£¬Ê¹Óü¯Ï߯÷µÄ¾ÖÓòÍøÔÚÎïÀíÉÏÊÇÒ»¸öÐÇÐÍÍø¡£µ«ÊǼ¯Ï߯÷ʹÓõç×ÓÆ÷¼þÀ´Ä£Äâʵ¼ÊÀÂÏߵŤ×÷£¬Âß¼­ÉÏÈÔÊÇÒ»¸ö×ÜÏßÍø£¬Õû¸öϵͳÈÔÏñÒ»¸ö´«Í³ÒÔÌ«ÍøÄÇÑùÔËÐС£ +从表é�¢ä¸Šçœ‹ï¼Œä½¿ç”¨é›†çº¿å™¨çš„局域网在物ç�†ä¸Šæ˜¯ä¸€ä¸ªæ˜Ÿåž‹ç½‘。但是集线器使用电å­�器件æ�¥æ¨¡æ‹Ÿå®žé™…缆线的工作,逻辑上ä»�是一个总线网,整个系统ä»�åƒ�一个传统以太网那样è¿�行。 ![](https://github.com/CyC2018/InterviewNotes/blob/master/pics/897a4f4e-2683-44e1-a26a-c0d0234dc576.jpg) ![](https://github.com/CyC2018/InterviewNotes/blob/master/pics/40c3f8e5-3a20-45b6-a60c-77b9b952e104.jpg) -## MAC ²ã +## 路由器交æ�¢æœºå’Œé›†çº¿å™¨çš„对比 +|集线器|路由器|交æ�¢æœº +-----------------|------|----- +traffic isolation |No|Yes|Yes +å�³æ�’å�³ç”¨|Yes|No|Yes -MAC µØÖ·ÊÇ 6 ×Ö½Ú£¨48 룩µÄµØÖ·£¬ÓÃÓÚΨһ±íÊ¾ÍøÂçÊÊÅäÆ÷£¨Íø¿¨£©£¬Ò»Ì¨Ö÷»úÓµÓжàÉÙ¸öÊÊÅäÆ÷¾ÍÓжàÉÙ¸ö MAC µØÖ·£¬ÀýÈç±Ê¼Ç±¾µçÄÔÆÕ±é´æÔÚÎÞÏßÍøÂçÊÊÅäÆ÷ºÍÓÐÏßÍøÂçÊÊÅäÆ÷¡£ +路由器æ��供防ç�«å¢™ä¿�护针对广播风暴,交æ�¢æœºä¸�é™�制 +## MAC 层 + +MAC 地å�€æ˜¯ 6 字节(48 ä½�)的地å�€ï¼Œç”¨äºŽå”¯ä¸€è¡¨ç¤ºç½‘络适é…�器(网å�¡ï¼‰ï¼Œä¸€å�°ä¸»æœºæ‹¥æœ‰å¤šå°‘个适é…�器就有多少个 MAC 地å�€ï¼Œä¾‹å¦‚笔记本电脑普é��存在无线网络适é…�器和有线网络适é…�器。 ![](https://github.com/CyC2018/InterviewNotes/blob/master/pics/50d38e84-238f-4081-8876-14ef6d7938b5.jpg) -- **ÀàÐÍ**£º±ê¼ÇÉϲãʹÓõÄЭÒ飻 -- **Êý¾Ý**£º³¤¶ÈÔÚ 46-1500 Ö®¼ä£¬Èç¹û̫СÔòÐèÒªÌî³ä£» -- **FCS**£ºÖ¡¼ìÑéÐòÁУ¬Ê¹ÓõÄÊÇ CRC ¼ìÑé·½·¨£» -- **ǰͬ²½Âë**£ºÖ»ÊÇΪÁ˼ÆËã FCS ÁÙʱ¼ÓÈëµÄ£¬¼ÆËã½áÊøÖ®ºó»á¶ªÆú¡£ +- **类型**:标记上层使用的å��议; +- **æ•°æ�®**:长度在 46-1500 之间,如果太å°�则需è¦�å¡«å……ï¼› +- **FCS**:帧检验åº�列,使用的是 CRC 检验方法; +- **å‰�å�Œæ­¥ç �**:å�ªæ˜¯ä¸ºäº†è®¡ç®— FCS 临时加入的,计算结æ�Ÿä¹‹å�Žä¼šä¸¢å¼ƒã€‚ -## ÐéÄâ¾ÖÓòÍø +## 虚拟局域网 -ÐéÄâ¾ÖÓòÍø¿ÉÒÔ½¨Á¢ÓëÎïÀíλÖÃÎ޹صÄÂß¼­×飬ֻÓÐÔÚͬһ¸öÐéÄâ¾ÖÓòÍøÖеijÉÔ±²Å»áÊÕµ½Á´Â·²ã¹ã²¥ÐÅÏ¢£¬ÀýÈçÏÂͼÖÐ (A1, A2, A3, A4) ÊôÓÚÒ»¸öÐéÄâ¾ÖÓòÍø£¬A1 ·¢Ë͵Ĺ㲥»á±» A2¡¢A3¡¢A4 ÊÕµ½£¬¶øÆäËüÕ¾µãÊÕ²»µ½¡£ +虚拟局域网å�¯ä»¥å»ºç«‹ä¸Žç‰©ç�†ä½�置无关的逻辑组,å�ªæœ‰åœ¨å�Œä¸€ä¸ªè™šæ‹Ÿå±€åŸŸç½‘中的æˆ�员æ‰�会收到链路层广播信æ�¯ï¼Œä¾‹å¦‚下图中 (A1, A2, A3, A4) 属于一个虚拟局域网,A1 å�‘é€�的广播会被 A2ã€�A3ã€�A4 收到,而其它站点收ä¸�到。 ![](https://github.com/CyC2018/InterviewNotes/blob/master/pics/a74b70ac-323a-4b31-b4d5-90569b8a944b.png) -# µÚËÄÕÂ ÍøÂç²ã* +# 第四章 网络层* -## Íø¼ÊЭÒé IP ¸ÅÊö +### 虚电路和数æ�®æŠ¥ç½‘络 -ÒòÎªÍøÂç²ãÊÇÕû¸ö»¥ÁªÍøµÄºËÐÄ£¬Òò´ËÓ¦µ±ÈÃÍøÂç²ã¾¡¿ÉÄܼòµ¥¡£ÍøÂç²ãÏòÉÏÖ»Ìṩ¼òµ¥Áé»îµÄ¡¢ÎÞÁ¬½ÓµÄ¡¢¾¡×î´óŬÁ¦½»»¥µÄÊý¾Ý±¨·þÎñ¡£ +虚电路是网络层的有连接æœ�务如ATM -ʹÓà IP ЭÒ飬¿ÉÒÔ°ÑÒì¹¹µÄÎïÀíÍøÂçÁ¬½ÓÆðÀ´£¬Ê¹µÃÔÚÍøÂç²ã¿´ÆðÀ´ºÃÏñÊÇÒ»¸öͳһµÄÍøÂç¡£ +æ•°æ�®æŠ¥ç½‘络是网络层的无连接æœ�务 + +主机与主机之间ä¸�å�Œæ—¶æ��供这两ç§�æœ�务 + +## 网际å��è®® IP 概述 + +因为网络层是整个互è�”网的核心,因此应当让网络层尽å�¯èƒ½ç®€å�•。网络层å�‘上æ��供简å�•ç�µæ´»çš„ã€�无连接的ã€�尽最大努力交互的数æ�®æŠ¥æœ�务。 + +使用 IP å��议,å�¯ä»¥æŠŠå¼‚构的物ç�†ç½‘络连接起æ�¥ï¼Œä½¿å¾—在网络层看起æ�¥å¥½åƒ�是一个统一的网络。 ![](https://github.com/CyC2018/InterviewNotes/blob/master/pics/fe3d224c-8ffd-40f9-85b1-86ffe1393f6c.jpg) -Óë IP ЭÒéÅäÌ×ʹÓõϹÓÐÈý¸öЭÒ飺 +与 IP å��è®®é…�套使用的还有三个å��议: -1. µØÖ·½âÎöЭÒé ARP£¨Address Resolution Protocol£© -2. Íø¼Ê¿ØÖƱ¨ÎÄЭÒé ICMP£¨Internet Control Message Protocol£© -3. Íø¼Ê×é¹ÜÀíЭÒé IGMP£¨Internet Group Management Protocol£© +1. 地å�€è§£æž�å��è®® ARP(Address Resolution Protocol) +2. 网际控制报文å��è®® ICMP(Internet Control Message Protocol) +3. 网际组管ç�†å��è®® IGMP(Internet Group Management Protocol) ![](https://github.com/CyC2018/InterviewNotes/blob/master/pics/163cf8b4-5f30-46c9-af00-316a71b3c890.jpg) -## IP Êý¾Ý±¨¸ñʽ +## IP æ•°æ�®æŠ¥æ ¼å¼� ![](https://github.com/CyC2018/InterviewNotes/blob/master/pics/8681db55-0873-434b-aa98-83d07e8392ae.jpg) -- **°æ±¾** : ÓÐ 4£¨IPv4£©ºÍ 6£¨IPv6£©Á½¸öÖµ£» +- **版本** : 有 4(IPv4)和 6(IPv6)两个值; -- **Êײ¿³¤¶È** : Õ¼ 4 룬Òò´Ë×î´óֵΪ 15¡£ÖµÎª 1 ±íʾµÄÊÇ 1 ¸ö 32 λ×ֵij¤¶È£¬Ò²¾ÍÊÇ 4 ×Ö½Ú¡£ÒòΪÊײ¿¹Ì¶¨³¤¶ÈΪ 20 ×Ö½Ú£¬Òò´Ë¸ÃÖµ×îСΪ 5¡£Èç¹û¿ÉÑ¡²¿·ÖµÄ³¤¶È²»ÊÇ 4 ×Ö½ÚµÄÕûÊý±¶£¬¾ÍÓÃβ²¿µÄÌî³ä²¿·ÖÀ´Ìî³ä¡£ +- **首部长度** : å�  4 ä½�,因此最大值为 15。值为 1 表示的是 1 个 32 ä½�字的长度,也就是 4 字节。因为首部固定长度为 20 字节,因此该值最å°�为 5。如果å�¯é€‰éƒ¨åˆ†çš„长度ä¸�是 4 字节的整数å€�,就用尾部的填充部分æ�¥å¡«å……。 -- **Çø·Ö·þÎñ** : ÓÃÀ´»ñµÃ¸üºÃµÄ·þÎñ£¬Ò»°ãÇé¿öϲ»Ê¹Óᣠ+- **区分æœ�务** : 用æ�¥èŽ·å¾—æ›´å¥½çš„æœ�务,一般情况下ä¸�使用。 -- **×ܳ¤¶È** : °üÀ¨Êײ¿³¤¶ÈºÍÊý¾Ý²¿·Ö³¤¶È¡£ +- **总长度** : 包括首部长度和数æ�®éƒ¨åˆ†é•¿åº¦ã€‚ -- **±êʶ** : ÔÚÊý¾Ý±¨³¤¶È¹ý³¤´Ó¶ø·¢Éú·ÖƬµÄÇé¿öÏ£¬ÏàͬÊý¾Ý±¨µÄ²»Í¬·ÖƬ¾ßÓÐÏàͬµÄ±êʶ·û¡£ +- **标识** : 在数æ�®æŠ¥é•¿åº¦è¿‡é•¿ä»Žè€Œå�‘生分片的情况下,相å�Œæ•°æ�®æŠ¥çš„ä¸�å�Œåˆ†ç‰‡å…·æœ‰ç›¸å�Œçš„æ ‡è¯†ç¬¦ã€‚ -- **Æ¬Æ«ÒÆ** : ºÍ±êʶ·ûÒ»Æð£¬ÓÃÓÚ·¢Éú·ÖƬµÄÇé¿ö¡£Æ¬Æ«ÒƵĵ¥Î»Îª 8 ×Ö½Ú¡£ +- **片å��ç§»** : 和标识符一起,用于å�‘生分片的情况。片å��移的å�•ä½�为 8 字节。 ![](https://github.com/CyC2018/InterviewNotes/blob/master/pics/45c86855-9b18-4cf4-a9a7-f8b6eb78d133.png) -- **Éú´æÊ±¼ä** £ºTTL£¬ËüµÄ´æÔÚÊÇΪÁË·ÀÖ¹ÎÞ·¨½»¸¶µÄÊý¾Ý±¨ÔÚ»¥ÁªÍøÖв»¶Ï¶µÈ¦×Ó¡£ÒÔ·ÓÉÆ÷ÌøÊýΪµ¥Î»£¬µ± TTL Ϊ 0 ʱ¾Í¶ªÆúÊý¾Ý±¨¡£ +- **生存时间** :TTL,它的存在是为了防止无法交付的数æ�®æŠ¥åœ¨äº’è�”网中ä¸�断兜圈å­�。以路由器跳数为å�•ä½�,当 TTL 为 0 时就丢弃数æ�®æŠ¥ã€‚ -- **ЭÒé**£ºÖ¸³öЯ´øµÄÊý¾ÝÓ¦¸ÃÉϽ»¸øÄĸöЭÒé½øÐд¦Àí£¬ÀýÈç ICMP¡¢TCP¡¢UDP µÈ¡£ +- **å��è®®**:指出æ�ºå¸¦çš„æ•°æ�®åº”该上交给哪个å��议进行处ç�†ï¼Œä¾‹å¦‚ ICMPã€�TCPã€�UDP 等。 -- **Êײ¿¼ìÑéºÍ**£ºÒòΪÊý¾Ý±¨Ã¿¾­¹ýÒ»¸ö·ÓÉÆ÷£¬¶¼ÒªÖØÐ¼ÆËã¼ìÑéºÍ£¬Òò´Ë¼ìÑéºÍ²»°üº¬Êý¾Ý²¿·Ö¿ÉÒÔ¼õÉÙ¼ÆËãµÄ¹¤×÷Á¿¡£ +- **首部检验和**:因为数æ�®æŠ¥æ¯�ç»�过一个路由器,都è¦�é‡�新计算检验和,因此检验和ä¸�包å�«æ•°æ�®éƒ¨åˆ†å�¯ä»¥å‡�少计算的工作é‡�。 -## IP µØÖ·±àÖ· +## IP 地å�€ç¼–å�€ -IP µØÖ·µÄ±àÖ··½Ê½¾­ÀúÁËÈý¸öÀúÊ·½×¶Î£º +IP 地å�€çš„ç¼–å�€æ–¹å¼�ç»�历了三个历å�²é˜¶æ®µï¼š -1. ·ÖÀࣻ -2. ×ÓÍø»®·Ö£» -3. ÎÞ·ÖÀà¡£ +1. 分类; +2. å­�网划分; +3. 无分类。 -### 1. ·ÖÀà +### 1. 分类 -ÓÉÁ½²¿·Ö×é³É£¬ÍøÂçºÅºÍÖ÷»úºÅ£¬ÆäÖв»Í¬Àà±ð¾ßÓв»Í¬µÄÍøÂçºÅ³¤¶È£¬²¢ÇÒÊǹ̶¨µÄ¡£ +由两部分组æˆ�,网络å�·å’Œä¸»æœºå�·ï¼Œå…¶ä¸­ä¸�å�Œç±»åˆ«å…·æœ‰ä¸�å�Œçš„网络å�·é•¿åº¦ï¼Œå¹¶ä¸”是固定的。 -IP µØÖ· ::= {< ÍøÂçºÅ >, < Ö÷»úºÅ >} +IP 地å�€ ::= {< 网络å�· >, < 主机å�· >} ![](https://github.com/CyC2018/InterviewNotes/blob/master/pics/2ddd6132-60be-4a72-9daa-3d9756191f4a.png) -### 2. ×ÓÍø»®·Ö +注æ„�网络IDä¸�能为0,它有特殊的用途,用æ�¥è¡¨ç¤ºæ‰€æœ‰ç½‘段,所以网络ID最å°�为1;网络ID也ä¸�能为127ï¼›127用æ�¥ä½œä¸ºç½‘络回路测试用。所以A类网络网络ID的有效范围是1-126å…±126个网络。 -ͨ¹ýÔÚÍøÂçºÅ×Ö¶ÎÖÐÄÃÒ»²¿·Ö×÷Ϊ×ÓÍøºÅ£¬°ÑÁ½¼¶ IP µØÖ·»®·ÖΪÈý¼¶ IP µØÖ·¡£×¢Ò⣬Íâ²¿ÍøÂç¿´²»µ½×ÓÍøµÄ´æÔÚ¡£ +主机å�·ä¸�能全是0,ä¸�能全是1,有特殊用途。 -IP µØÖ· ::= {< ÍøÂçºÅ >, < ×ÓÍøºÅ >, < Ö÷»úºÅ >} +### 2. å­�网划分 -ҪʹÓÃ×ÓÍø£¬±ØÐëÅäÖÃ×ÓÍøÑÚÂë¡£Ò»¸ö B ÀàµØÖ·µÄĬÈÏ×ÓÍøÑÚÂëΪ 255.255.0.0£¬Èç¹û B ÀàµØÖ·µÄ×ÓÍøÕ¼Á½¸ö±ÈÌØ£¬ÄÇô×ÓÍøÑÚÂëΪ 11111111 11111111 11000000 000000£¬Ò²¾ÍÊÇ 255.255.192.0¡£ +通过在网络å�·å­—段中拿一部分作为å­�网å�·ï¼ŒæŠŠä¸¤çº§ IP 地å�€åˆ’分为三级 IP 地å�€ã€‚注æ„�,外部网络看ä¸�到å­�网的存在。 -### 3. ÎÞ·ÖÀà +IP 地å�€ ::= {< 网络å�· >, < å­�网å�· >, < 主机å�· >} -ÎÞ·ÖÀà±àÖ· CIDR Ïû³ýÁË´«Í³ A Àà¡¢B ÀàºÍ C ÀàµØÖ·ÒÔ¼°»®·Ö×ÓÍøµÄ¸ÅÄʹÓÃÍøÂçǰ׺ºÍÖ÷»úºÅÀ´¶Ô IP µØÖ·½øÐбàÂë£¬ÍøÂçǰ׺µÄ³¤¶È¿ÉÒÔ¸ù¾ÝÐèÒª±ä»¯¡£ +è¦�使用å­�网,必须é…�ç½®å­�网掩ç �。一个 B 类地å�€çš„默认å­�网掩ç �为 255.255.0.0,如果 B 类地å�€çš„å­�网å� ä¸¤ä¸ªæ¯”特,那么å­�网掩ç �为 11111111 11111111 11000000 000000,也就是 255.255.192.0。 -IP µØÖ· ::= {< ÍøÂçǰ׺ºÅ >, < Ö÷»úºÅ >} +### 3. 无分类 -CIDR µÄ¼Ç·¨ÉϲÉÓÃÔÚ IP µØÖ·ºóÃæ¼ÓÉÏÍøÂçǰ׺³¤¶ÈµÄ·½·¨£¬ÀýÈç 128.14.35.7/20 ±íʾǰ 20 Î»ÎªÍøÂçǰ׺¡£ +无分类编å�€ CIDR 消除了传统 A ç±»ã€�B 类和 C 类地å�€ä»¥å�Šåˆ’分å­�网的概念,使用网络å‰�缀和主机å�·æ�¥å¯¹ IP 地å�€è¿›è¡Œç¼–ç �,网络å‰�缀的长度å�¯ä»¥æ ¹æ�®éœ€è¦�å�˜åŒ–。 -CIDR µÄµØÖ·ÑÚÂë¿ÉÒÔ¼ÌÐø³ÆÎª×ÓÍøÑÚÂ룬×ÓÍøÑÚÂëÊ× 1 ³¤¶ÈÎªÍøÂçǰ׺µÄ³¤¶È¡£ +IP 地å�€ ::= {< 网络å‰�ç¼€å�· >, < 主机å�· >} -Ò»¸ö CIDR µØÖ·¿éÖÐÓÐºÜ¶àµØÖ·£¬Ò»¸ö CIDR ±íʾµÄÍøÂç¾Í¿ÉÒÔ±íʾԭÀ´µÄºÜ¶à¸öÍøÂ磬²¢ÇÒÔÚ·ÓɱíÖÐÖ»ÐèÒªÒ»¸ö·ÓɾͿÉÒÔ´úÌæÔ­À´µÄ¶à¸ö·ÓÉ£¬¼õÉÙÁË·ÓɱíÏîµÄÊýÁ¿¡£°ÑÕâÖÖͨ¹ýʹÓÃÍøÂçǰ׺À´¼õÉÙ·ÓɱíÏîµÄ·½Ê½³ÆÎªÂ·Óɾۺϣ¬Ò²³ÆÎª **¹¹³É³¬Íø**¡£ +CIDR 的记法上采用在 IP 地å�€å�Žé�¢åŠ ä¸Šç½‘ç»œå‰�缀长度的方法,例如 128.14.35.7/20 表示å‰� 20 ä½�为网络å‰�缀。 -ÔÚ·ÓɱíÖеÄÏîÄ¿ÓÉ¡°ÍøÂçǰ׺¡±ºÍ¡°ÏÂÒ»ÌøµØÖ·¡±×é³É£¬ÔÚ²éÕÒʱ¿ÉÄÜ»áµÃµ½²»Ö¹Ò»¸öÆ¥Åä½á¹û£¬Ó¦µ±²ÉÓÃ×ǰ׺ƥÅäÀ´È·¶¨Ó¦¸ÃÆ¥ÅäÄÄÒ»¸ö¡£ +CIDR 的地å�€æŽ©ç �å�¯ä»¥ç»§ç»­ç§°ä¸ºå­�网掩ç �,å­�网掩ç �首 1 长度为网络å‰�缀的长度。 -## IP µØÖ·ºÍ MAC µØÖ· +一个 CIDR 地å�€å�—中有很多地å�€ï¼Œä¸€ä¸ª CIDR 表示的网络就å�¯ä»¥è¡¨ç¤ºåŽŸæ�¥çš„很多个网络,并且在路由表中å�ªéœ€è¦�一个路由就å�¯ä»¥ä»£æ›¿åŽŸæ�¥çš„多个路由,å‡�少了路由表项的数é‡�。把这ç§�通过使用网络å‰�ç¼€æ�¥å‡�少路由表项的方å¼�称为路由è�šå�ˆï¼Œä¹Ÿç§°ä¸º **æž„æˆ�超网**。 -ÍøÂç²ãʵÏÖÖ÷»úÖ®¼äµÄͨÐÅ£¬¶øÁ´Â·²ãʵÏÖ¾ßÌåÿ¶ÎÁ´Â·Ö®¼äµÄͨÐÅ¡£Òò´ËÔÚͨÐŹý³ÌÖУ¬IP Êý¾Ý±¨µÄÔ´µØÖ·ºÍÄ¿µÄµØÖ·Ê¼ÖÕ²»±ä£¬¶ø MAC µØÖ·Ëæ×ÅÁ´Â·µÄ¸Ä±ä¶ø¸Ä±ä¡£ +在路由表中的项目由“网络å‰�ç¼€â€�和“下一跳地å�€â€�组æˆ�,在查找时å�¯èƒ½ä¼šå¾—到ä¸�止一个匹é…�结果,应当采用最长å‰�缀匹é…�æ�¥ç¡®å®šåº”该匹é…�哪一个。 + +**å­�网掩ç �和广播地å�€ï¼š** + +1个ipå­�网掩ç �的网络ä½�å…¨1,主机ä½�全为0。广播地å�€çš„主机ä½�å…¨1,网络ä½�å’Œip一样 + + +## IP 地å�€å’Œ MAC 地å�€ + +ipv4 32ä½�. + +ipv6 128ä½�:分割。 8组4ä½�16进制数 + +MAC 48ä½� +网络层实现主机之间的通信,而链路层实现具体æ¯�段链路之间的通信。因此在通信过程中,IP æ•°æ�®æŠ¥çš„æº�地å�€å’Œç›®çš„地å�€å§‹ç»ˆä¸�å�˜ï¼Œè€Œ MAC 地å�€éš�ç�€é“¾è·¯çš„æ”¹å�˜è€Œæ”¹å�˜ã€‚ ![](https://github.com/CyC2018/InterviewNotes/blob/master/pics/86b71296-0d1e-4a63-bcd9-54955b6b781b.jpg) -## µØÖ·½âÎöЭÒé ARP +## 地å�€è§£æž�å��è®® ARP -ʵÏÖÓÉ IP µØÖ·µÃµ½ MAC µØÖ·¡£ +实现由 IP 地å�€å¾—到 MAC 地å�€ã€‚ -ÿ¸öÖ÷»ú¶¼ÓÐÒ»¸ö ARP ¸ßËÙ»º´æ£¬´æ·ÅÓ³Éä±í¡£Èç¹ûÒ»¸ö IP µØÖ·µ½ MAC µØÖ·µÄÓ³Éä²»ÔڸñíÖУ¬Ö÷»úͨ¹ý¹ã²¥µÄ·½Ê½·¢ËÍ ARP ÇëÇó·Ö×飬ƥÅä IP µØÖ·µÄÖ÷»ú»á·¢ËÍ ARP ÏìÓ¦·Ö×é¸æÖªÆä MAC µØÖ·¡£ +æ¯�个主机都有一个 ARP 高速缓存,存放映射表。如果一个 IP 地å�€åˆ° MAC 地å�€çš„æ˜ å°„ä¸�在该表中,主机通过广播的方å¼�å�‘é€� ARP 请求分组,匹é…� IP 地å�€çš„主机会å�‘é€� ARP å“�应分组告知其 MAC 地å�€ã€‚ ![](https://github.com/CyC2018/InterviewNotes/blob/master/pics/8bc6fc2c-d198-4759-b06c-18d94d851e97.png) -## ·ÓÉÆ÷µÄ½á¹¹ +## 路由器的结构 -·ÓÉÆ÷´Ó¹¦ÄÜÉÏ¿ÉÒÔ»®·ÖΪÁ½´ó²¿·Ö£ºÂ·ÓÉÑ¡ÔñºÍ·Ö×éת·¢¡£ +路由器从功能上å�¯ä»¥åˆ’分为两大部分:路由选择和分组转å�‘。 -·Ö×éת·¢²¿·ÖÓÉÈý²¿·Ö×é³É£º½»»»½á¹¹¡¢Ò»×éÊäÈë¶Ë¿ÚºÍÒ»×éÊä³ö¶Ë¿Ú¡£ +forwarding å�•一路由器从一æ�¡é“¾æŽ¥æ”¶æ•°æ�®ä»Žå�¦ä¸€æ�¡é“¾å‡ºåŽ» + +routing 从æº�到目的的众多路由中选择一æ�¡è·¯å¾„ + +分组转å�‘部分由三部分组æˆ�:交æ�¢ç»“æž„ã€�一组输入端å�£å’Œä¸€ç»„输出端å�£ã€‚ ![](https://github.com/CyC2018/InterviewNotes/blob/master/pics/3a676c54-b559-4466-9b21-eb10f1e25879.jpg) -½»»»½á¹¹µÄ½»»»ÍøÂçÓÐÒÔÏÂÈýÖÖʵÏÖ·½Ê½£º +交æ�¢ç»“构的交æ�¢ç½‘络有以下三ç§�实现方å¼�: ![](https://github.com/CyC2018/InterviewNotes/blob/master/pics/7f82fd18-7f16-4125-ada6-bb6b795b4fda.png) -## ½»»»»úÓë·ÓÉÆ÷µÄÇø±ð +## 交æ�¢æœºä¸Žè·¯ç”±å™¨çš„区别 -- ½»»»»ú¹¤×÷ÓÚÊý¾ÝÁ´Â·²ã£¬ÄÜʶ±ð MAC µØÖ·£¬¸ù¾Ý MAC µØÖ·×ª·¢Á´Â·²ãÊý¾ÝÖ¡¡£¾ßÓÐ×Ôѧ»úÖÆÀ´Î¬»¤ IP µØÖ·Óë MAC µØÖ·µÄÓ³Éä¡£ -- ·ÓÉÆ÷λÓÚÍøÂç²ã£¬ÄÜʶ±ð IP µØÖ·²¢¸ù¾Ý IP µØÖ·×ª·¢·Ö×顣ά»¤×Å·ÓÉ±í£¬¸ù¾Ý·ÓɱíÑ¡Ôñ×î¼Ñ·Ïß¡£ +- 交æ�¢æœºå·¥ä½œäºŽæ•°æ�®é“¾è·¯å±‚,能识别 MAC 地å�€ï¼Œæ ¹æ�® MAC 地å�€è½¬å�‘链路层数æ�®å¸§ã€‚具有自学机制æ�¥ç»´æŠ¤ IP 地å�€ä¸Ž MAC 地å�€çš„æ˜ å°„。 +- 路由器ä½�于网络层,能识别 IP 地å�€å¹¶æ ¹æ�® IP 地å�€è½¬å�‘分组。维护ç�€è·¯ç”±è¡¨ï¼Œæ ¹æ�®è·¯ç”±è¡¨é€‰æ‹©æœ€ä½³è·¯çº¿ã€‚ -## ·ÓÉÆ÷·Ö×éת·¢Á÷³Ì +## 路由器分组转å�‘æµ�程 -1. ´ÓÊý¾Ý±¨µÄÊײ¿ÌáȡĿµÄÖ÷»úµÄ IP µØÖ· D£¬µÃµ½Ä¿µÄÍøÂçµØÖ· N¡££¨Â·ÓɱíÏîÊÇÍøÂçºÅ¶ø²»ÊÇ IP µØÖ·£¬ÕâÑù×ö´ó´ó¼õÉÙÁË·ÓɱíÌõÄ¿ÊýÁ¿£© -2. Èô N ¾ÍÊÇÓë´Ë·ÓÉÆ÷Ö±½ÓÏàÁ¬µÄij¸öÍøÂçµØÖ·£¬Ôò½øÐÐÖ±½Ó½»¸¶£» -3. Èô·ÓɱíÖÐÓÐÄ¿µÄµØÖ·Îª D µÄÌØ¶¨Ö÷»ú·ÓÉ£¬Ôò°ÑÊý¾Ý±¨´«Ë͸ø±íÖÐËùÖ¸Ã÷µÄÏÂÒ»ÌøÂ·ÓÉÆ÷£» -4. Èô·ÓɱíÖÐÓе½´ïÍøÂç N µÄ·ÓÉ£¬Ôò°ÑÊý¾Ý±¨´«Ë͸øÂ·ÓɱíÖÐËùÖ¸Ã÷µÄÏÂÒ»ÌøÂ·ÓÉÆ÷£» -5. Èô·ÓɱíÖÐÓÐÒ»¸öĬÈÏ·ÓÉ£¬Ôò°ÑÊý¾Ý±¨´«Ë͸øÂ·ÓɱíÖÐËùÖ¸Ã÷µÄĬÈÏ·ÓÉÆ÷£» -6. ±¨¸æ×ª·¢·Ö×é³ö´í¡£ +1. 从数æ�®æŠ¥çš„首部æ��å�–目的主机的 IP 地å�€ D,得到目的网络地å�€ N。(路由表项是网络å�·è€Œä¸�是 IP 地å�€ï¼Œè¿™æ ·å�šå¤§å¤§å‡�少了路由表æ�¡ç›®æ•°é‡�) +2. è‹¥ N 就是与此路由器直接相连的æŸ�个网络地å�€ï¼Œåˆ™è¿›è¡Œç›´æŽ¥äº¤ä»˜ï¼› +3. 若路由表中有目的地å�€ä¸º D 的特定主机路由,则把数æ�®æŠ¥ä¼ é€�给表中所指明的下一跳路由器; +4. 若路由表中有到达网络 N 的路由,则把数æ�®æŠ¥ä¼ é€�给路由表中所指明的下一跳路由器; +5. 若路由表中有一个默认路由,则把数æ�®æŠ¥ä¼ é€�给路由表中所指明的默认路由器; +6. 报告转å�‘分组出错。 ![](https://github.com/CyC2018/InterviewNotes/blob/master/pics/8d211911-0e62-4190-ab00-d8610adec4a0.jpg) -## ·ÓÉÑ¡ÔñЭÒé +## 路由选择å��è®® -»¥ÁªÍøÊ¹ÓõÄ·ÓÉÑ¡ÔñЭÒé¶¼ÊÇ×ÔÊÊÓ¦µÄ£¬ÄÜËæ×ÅÍøÂçͨÐÅÁ¿ºÍÍØÆË½á¹¹µÄ±ä»¯¶ø×ÔÊÊÓ¦µØ½øÐе÷Õû¡£ +互è�”网使用的路由选择å��议都是自适应的,能éš�ç�€ç½‘络通信é‡�和拓扑结构的å�˜åŒ–而自适应地进行调整。 -»¥ÁªÍø¿ÉÒÔ»®·ÖΪÐí¶à½ÏСµÄ×ÔÖÎϵͳ AS£¬Ò»¸ö AS ¿ÉÒÔʹÓÃÒ»ÖֺͱðµÄ AS ²»Í¬µÄ·ÓÉÑ¡ÔñЭÒé¡£ +互è�”网å�¯ä»¥åˆ’分为许多较å°�的自治系统 AS,一个 AS å�¯ä»¥ä½¿ç”¨ä¸€ç§�和别的 AS ä¸�å�Œçš„路由选择å��议。 -¿ÉÒÔ°Ñ·ÓÉÑ¡ÔñЭÒé»®·ÖΪÁ½´óÀࣺ +å�¯ä»¥æŠŠè·¯ç”±é€‰æ‹©å��议划分为两大类: -1. ÄÚ²¿Íø¹ØÐ­Òé IGP£¨Interior Gateway Protocol£©£ºÔÚ AS ÄÚ²¿Ê¹Óã¬Èç RIP ºÍ OSPF¡£ -2. Íâ²¿Íø¹ØÐ­Òé EGP£¨External Gateway Protocol£©£ºÔÚ AS Ö®¼äʹÓã¬Èç BGP¡£ +1. 内部网关å��è®® IGP(Interior Gateway Protocol):在 AS 内部使用,如 RIP å’Œ OSPF。 +2. 外部网关å��è®® EGP(External Gateway Protocol):在 AS 之间使用,如 BGP。 ![](https://github.com/CyC2018/InterviewNotes/blob/master/pics/e0be6970-5b0e-44a2-bc71-df4d61c42b8f.jpg) -### 1. ÄÚ²¿Íø¹ØÐ­Òé RIP +### 1. 内部网关å��è®® RIP -RIP ÊÇÒ»ÖÖ·Ö²¼Ê½µÄ»ùÓÚ¾àÀëÏòÁ¿µÄ·ÓÉÑ¡ÔñЭÒé¡£¾àÀëÊÇÖ¸ÌøÊý£¬Ö±½ÓÏàÁ¬µÄ·ÓÉÆ÷ÌøÊýΪ 1£¬ÌøÊý×î¶àΪ 15£¬³¬¹ý 15 ±íʾ²»¿É´ï¡£ +RIP 是一ç§�分布å¼�的基于è·�离å�‘é‡�的路由选择å��议。è·�离是指跳数,直接相连的路由器跳数为 1,跳数最多为 15,超过 15 表示ä¸�å�¯è¾¾ã€‚ -RIP °´¹Ì¶¨µÄʱ¼ä¼ä¸ô½öºÍÏàÁÚ·ÓÉÆ÷½»»»×Ô¼ºµÄ·ÓÉ±í£¬¾­¹ýÈô¸É´Î½»»»Ö®ºó£¬ËùÓзÓÉÆ÷×îÖÕ»áÖªµÀµ½´ï±¾×ÔÖÎϵͳÖÐÈκÎÒ»¸öÍøÂçµÄ×î¶Ì¾àÀëºÍÏÂÒ»ÌøÂ·ÓÉÆ÷µØÖ·¡£ +RIP 按固定的时间间隔仅和相邻路由器交æ�¢è‡ªå·±çš„路由表,ç»�过若干次交æ�¢ä¹‹å�Žï¼Œæ‰€æœ‰è·¯ç”±å™¨æœ€ç»ˆä¼šçŸ¥é�“到达本自治系统中任何一个网络的最短è·�离和下一跳路由器地å�€ã€‚ -¾àÀëÏòÁ¿Ëã·¨£º +è·�离å�‘é‡�算法: -1. ¶ÔµØÖ·Îª X µÄÏàÁÚ·ÓÉÆ÷·¢À´µÄ RIP ±¨ÎÄ£¬ÏÈÐ޸ı¨ÎÄÖеÄËùÓÐÏîÄ¿£¬°ÑÏÂÒ»Ìø×Ö¶ÎÖеĵØÖ·¸ÄΪ X£¬²¢°ÑËùÓеľàÀë×Ö¶Î¼Ó 1£» -2. ¶ÔÐ޸ĺóµÄ RIP ±¨ÎÄÖеÄÿһ¸öÏîÄ¿£¬½øÐÐÒÔϲ½Ö裺 - - ÈôÔ­À´µÄ·ÓɱíÖÐûÓÐÄ¿µÄÍøÂç N£¬Ôò°Ñ¸ÃÏîÄ¿Ìí¼Óµ½Â·ÓɱíÖУ» - - ·ñÔò£ºÈôÏÂÒ»ÌøÂ·ÓÉÆ÷µØÖ·ÊÇ X£¬Ôò°ÑÊÕµ½µÄÏîÄ¿Ìæ»»Ô­À´Â·ÓɱíÖеÄÏîÄ¿£»·ñÔò£ºÈôÊÕµ½µÄÏîÄ¿ÖеľàÀë d СÓÚ·ÓɱíÖеľàÀ룬Ôò½øÐиüУ¨ÀýÈçԭʼ·ÓɱíÏîΪ Net2, 5, P£¬Ð±íÏîΪ Net2, 4, X£¬Ôò¸üУ©£»·ñÔòʲôҲ²»×ö¡£ -3. Èô 3 ·ÖÖÓ»¹Ã»ÓÐÊÕµ½ÏàÁÚ·ÓÉÆ÷µÄ¸üзÓÉ±í£¬Ôò°Ñ¸ÃÏàÁÚ·ÓÉÆ÷±êΪ²»¿É´ï£¬¼´°Ñ¾àÀëÖÃΪ 16¡£ +1. 对地å�€ä¸º X 的相邻路由器å�‘æ�¥çš„ RIP 报文,先修改报文中的所有项目,把下一跳字段中的地å�€æ”¹ä¸º X,并把所有的è·�离字段加 1ï¼› +2. 对修改å�Žçš„ RIP 报文中的æ¯�一个项目,进行以下步骤: + - 若原æ�¥çš„路由表中没有目的网络 N,则把该项目添加到路由表中; + - å�¦åˆ™ï¼šè‹¥ä¸‹ä¸€è·³è·¯ç”±å™¨åœ°å�€æ˜¯ X,则把收到的项目替æ�¢åŽŸæ�¥è·¯ç”±è¡¨ä¸­çš„项目;å�¦åˆ™ï¼šè‹¥æ”¶åˆ°çš„项目中的è·�离 d å°�于路由表中的è·�离,则进行更新(例如原始路由表项为 Net2, 5, P,新表项为 Net2, 4, X,则更新);å�¦åˆ™ä»€ä¹ˆä¹Ÿä¸�å�šã€‚ +3. è‹¥ 3 分钟还没有收到相邻路由器的更新路由表,则把该相邻路由器标为ä¸�å�¯è¾¾ï¼Œå�³æŠŠè·�离置为 16。 -RIP ЭÒéʵÏÖ¼òµ¥£¬¿ªÏúС£¬µ«ÊÇ RIP ÄÜʹÓõÄ×î´ó¾àÀëΪ 15£¬ÏÞÖÆÁËÍøÂçµÄ¹æÄ£¡£²¢ÇÒµ±ÍøÂç³öÏÖ¹ÊÕÏʱ£¬Òª¾­¹ý±È½Ï³¤µÄʱ¼ä²ÅÄܽ«´ËÏûÏ¢´«Ë͵½ËùÓзÓÉÆ÷¡£ +RIP å��议实现简å�•,开销å°�,但是 RIP 能使用的最大è·�离为 15,é™�制了网络的规模。并且当网络出现故障时,è¦�ç»�过比较长的时间æ‰�能将此消æ�¯ä¼ é€�到所有路由器。 -### 2. ÄÚ²¿Íø¹ØÐ­Òé OSPF -¿ª·Å×î¶Ì·¾¶ÓÅÏÈ OSPF£¬ÊÇΪÁ˿˷þ RIP µÄȱµã¶ø¿ª·¢³öÀ´µÄ¡£ +当è·�离改å�˜æ—¶ï¼Œå�¯èƒ½å‡ºçŽ°é€‰æ‹©é—­çŽ¯ã€‚ -¿ª·Å±íʾ OSPF ²»ÊÜijһ¼Ò³§ÉÌ¿ØÖÆ£¬¶øÊǹ«¿ª·¢±íµÄ£»×î¶Ì·¾¶ÓÅÏȱíʾʹÓÃÁË Dijkstra Ìá³öµÄ×î¶Ì·¾¶Ëã·¨ SPF¡£ +解决方法:毒性逆转 å�³å°†ç›´æŽ¥ç›¸è¿žçš„è¾¹æ�ƒä¸”此边æ�ƒé�žæœ€å°�费用置为无穷大 -OSPF ¾ßÓÐÒÔÏÂÌØµã£º +### 2. 内部网关å��è®® OSPF -- Ïò±¾×ÔÖÎϵͳÖеÄËùÓзÓÉÆ÷·¢ËÍÐÅÏ¢£¬ÕâÖÖ·½·¨ÊǺ鷺·¨¡£ -- ·¢Ë͵ÄÐÅÏ¢¾ÍÊÇÓëÏàÁÚ·ÓÉÆ÷µÄÁ´Â·×´Ì¬£¬Á´Â·×´Ì¬°üÀ¨ÓëÄÄЩ·ÓÉÆ÷ÏàÁ¬ÒÔ¼°Á´Â·µÄ¶ÈÁ¿£¬¶ÈÁ¿Ó÷ÑÓᢾàÀ롢ʱÑÓ¡¢´ø¿íµÈÀ´±íʾ¡£ -- Ö»Óе±Á´Â·×´Ì¬·¢Éú±ä»¯Ê±£¬Â·ÓÉÆ÷²Å»á·¢ËÍÐÅÏ¢¡£ +开放最短路径优先 OSPF,是为了克æœ� RIP 的缺点而开å�‘出æ�¥çš„。 -ËùÓзÓÉÆ÷¶¼¾ßÓÐÈ«ÍøµÄÍØÆË½á¹¹Í¼£¬²¢ÇÒÊÇÒ»Öµġ£Ïà±ÈÓÚ RIP£¬OSPF µÄ¸üйý³ÌÊÕÁ²µÄºÜ¿ì¡£ +开放表示 OSPF ä¸�å�—æŸ�一家厂商控制,而是公开å�‘表的;最短路径优先表示使用了 Dijkstra æ��出的最短路径算法 SPF。 -### 3. Íâ²¿Íø¹ØÐ­Òé BGP +OSPF 具有以下特点: -AS Ö®¼äµÄ·ÓÉÑ¡ÔñºÜÀ§ÄÑ£¬Ö÷ÒªÊÇ»¥ÁªÍø¹æÄ£ºÜ´ó¡£²¢ÇÒ¸÷¸ö AS ÄÚ²¿Ê¹Óò»Í¬µÄ·ÓÉÑ¡ÔñЭÒ飬¾ÍÎÞ·¨×¼È·¶¨Òå·¾¶µÄ¶ÈÁ¿¡£²¢ÇÒ AS Ö®¼äµÄ·ÓÉÑ¡Ôñ±ØÐ뿼ÂÇÓйصIJßÂÔ£¬±ÈÈçÓÐЩ AS ²»Ô¸ÒâÈÃÆäËü AS ¾­¹ý¡£ +- å�‘本自治系统中的所有路由器å�‘é€�ä¿¡æ�¯ï¼Œè¿™ç§�方法是洪泛法。 +- å�‘é€�的信æ�¯å°±æ˜¯ä¸Žç›¸é‚»è·¯ç”±å™¨çš„链路状æ€�,链路状æ€�包括与哪些路由器相连以å�Šé“¾è·¯çš„度é‡�,度é‡�用费用ã€�è·�离ã€�æ—¶å»¶ã€�带宽等æ�¥è¡¨ç¤ºã€‚ +- å�ªæœ‰å½“链路状æ€�å�‘生å�˜åŒ–时,路由器æ‰�会å�‘é€�ä¿¡æ�¯ã€‚ -BGP Ö»ÄÜѰÕÒÒ»Ìõ±È½ÏºÃµÄ·ÓÉ£¬¶ø²»ÊÇ×î¼Ñ·ÓÉ¡£Ëü²ÉÓ÷¾¶ÏòÁ¿Â·ÓÉÑ¡ÔñЭÒé¡£ +所有路由器都具有全网的拓扑结构图,并且是一致的。相比于 RIP,OSPF 的更新过程收敛的很快。 -ÿ¸ö AS ¶¼±ØÐëÅäÖà BGP ·¢ÑÔÈË£¬Í¨¹ýÔÚÁ½¸öÏàÁÚ BGP ·¢ÑÔÈËÖ®¼ä½¨Á¢ TCP Á¬½ÓÀ´½»»»Â·ÓÉÐÅÏ¢¡£ +### 3. 外部网关å��è®® BGP + +AS 之间的路由选择很困难,主è¦�是互è�”网规模很大。并且å�„个 AS 内部使用ä¸�å�Œçš„路由选择å��议,就无法准确定义路径的度é‡�。并且 AS 之间的路由选择必须考虑有关的策略,比如有些 AS ä¸�æ„¿æ„�让其它 AS ç»�过。 + +BGP å�ªèƒ½å¯»æ‰¾ä¸€æ�¡æ¯”较好的路由,而ä¸�是最佳路由。它采用路径å�‘é‡�路由选择å��议。 + +æ¯�个 AS 都必须é…�ç½® BGP å�‘言人,通过在两个相邻 BGP å�‘言人之间建立 TCP 连接æ�¥äº¤æ�¢è·¯ç”±ä¿¡æ�¯ã€‚ ![](https://github.com/CyC2018/InterviewNotes/blob/master/pics/eb6271de-22c9-4f4b-8b31-eab1f560efac.png) -## Íø¼Ê¿ØÖƱ¨ÎÄЭÒé ICMP +## 网际控制报文å��è®® ICMP -ICMP ÊÇΪÁ˸üÓÐЧµØ×ª·¢ IP Êý¾Ý±¨ºÍÌá¸ß½»¸¶³É¹¦µÄ»ú»á¡£Ëü·â×°ÔÚ IP Êý¾Ý±¨ÖУ¬µ«ÊDz»ÊôÓڸ߲ãЭÒé¡£ +ICMP 是为了更有效地转å�‘ IP æ•°æ�®æŠ¥å’Œæ��高交付æˆ�功的机会。它å°�装在 IP æ•°æ�®æŠ¥ä¸­ï¼Œä½†æ˜¯ä¸�属于高层å��议。 ![](https://github.com/CyC2018/InterviewNotes/blob/master/pics/9b5e0fa0-9274-4219-a3a9-84fbb509c735.jpg) -ICMP ±¨ÎÄ·ÖΪ²î´í±¨¸æ±¨ÎĺÍѯÎʱ¨ÎÄ¡£ +ICMP 报文分为差错报告报文和询问报文。 ![](https://github.com/CyC2018/InterviewNotes/blob/master/pics/6e11b122-95ce-4869-bf7d-3b0d7591707e.jpg) -## ·Ö×éÍø¼ä̽²â PING +## 分组网间探测 PING -PING ÊÇ ICMP µÄÒ»¸öÖØÒªÓ¦Óã¬Ö÷ÒªÓÃÀ´²âÊÔÁ½Ì¨Ö÷»úÖ®¼äµÄÁ¬Í¨ÐÔ¡£ +PING 是 ICMP 的一个é‡�è¦�应用,主è¦�用æ�¥æµ‹è¯•两å�°ä¸»æœºä¹‹é—´çš„连通性。 -PING µÄ¹ý³Ì£º +PING 的过程: -1. PING ͬһ¸öÍø¶ÎµÄÖ÷»ú£º²éÕÒÄ¿µÄÖ÷»úµÄ MAC µØÖ·£¬È»ºóÖ±½Ó½»¸¶¡£Èç¹ûÎÞ·¨²éÕÒµ½ MAC µØÖ·£¬¾ÍÒª½øÐÐÒ»´Î ARP ÇëÇó¡£ -2. PING ²»Í¬Íø¶ÎµÄÖ÷»ú£º·¢Ë͵½Íø¹ØÈÃÆä½øÐÐת·¢¡£Í¬ÑùÒª·¢Ë͵½Íø¹ØÒ²ÐèҪͨ¹ý²éÕÒÍø¹ØµÄ MAC µØÖ·£¬¸ù¾Ý MAC µØÖ·½øÐÐת·¢¡£ +1. PING å�Œä¸€ä¸ªç½‘段的主机:查找目的主机的 MAC 地å�€ï¼Œç„¶å�Žç›´æŽ¥äº¤ä»˜ã€‚如果无法查找到 MAC 地å�€ï¼Œå°±è¦�进行一次 ARP 请求。 +2. PING ä¸�å�Œç½‘段的主机:å�‘é€�到网关让其进行转å�‘。å�Œæ ·è¦�å�‘é€�到网关也需è¦�通过查找网关的 MAC 地å�€ï¼Œæ ¹æ�® MAC 地å�€è¿›è¡Œè½¬å�‘。 -## IP ¶à²¥ +## IP 多播 -ÔÚÒ»¶Ô¶àµÄͨÐÅÖУ¬¶à²¥²»ÐèÒª½«·Ö×鏴֯¶à·Ý£¬´Ó¶ø´ó´ó½ÚÔ¼ÍøÂç×ÊÔ´¡£ +在一对多的通信中,多播ä¸�需è¦�将分组å¤�制多份,从而大大节约网络资æº�。 ![](https://github.com/CyC2018/InterviewNotes/blob/master/pics/c77b6a18-dfac-42a2-ac89-7e99481275dc.jpg) -## ÐéÄâרÓÃÍø VPN +## 虚拟专用网 VPN -ÓÉÓÚ IP µØÖ·µÄ½ôȱ£¬Ò»¸ö»ú¹¹ÄÜÉêÇëµ½µÄ IP µØÖ·ÊýÍùÍùԶСÓÚ±¾»ú¹¹ËùÓµÓеÄÖ÷»úÊý¡£²¢ÇÒÒ»¸ö»ú¹¹²¢²»ÐèÒª°ÑËùÓеÄÖ÷»ú½ÓÈëµ½ÍⲿµÄ»¥ÁªÍøÖУ¬»ú¹¹ÄڵļÆËã»ú¿ÉÒÔʹÓýöÔÚ±¾»ú¹¹ÓÐЧµÄ IP µØÖ·£¨×¨ÓõØÖ·£©¡£ +由于 IP 地å�€çš„紧缺,一个机构能申请到的 IP 地å�€æ•°å¾€å¾€è¿œå°�于本机构所拥有的主机数。并且一个机构并ä¸�需è¦�把所有的主机接入到外部的互è�”网中,机构内的计算机å�¯ä»¥ä½¿ç”¨ä»…在本机构有效的 IP 地å�€ï¼ˆä¸“用地å�€ï¼‰ã€‚ -ÓÐÈý¸öרÓõØÖ·¿é£º +有三个专用地å�€å�—: 1. 10.0.0.0 \~ 10.255.255.255 2. 172.16.0.0 \~ 172.31.255.255 3. 192.168.0.0 \~ 192.168.255.255 -VPN ʹÓù«ÓõĻ¥ÁªÍø×÷Ϊ±¾»ú¹¹¸÷רÓÃÍøÖ®¼äµÄͨÐÅÔØÌ塣רÓÃÖ¸»ú¹¹ÄÚµÄÖ÷»úÖ»Óë±¾»ú¹¹Ä򵀮äËüÖ÷»úͨÐÅ£»ÐéÄâÖ¸¡°ºÃÏñÊÇ¡±£¬¶øÊµ¼ÊÉϲ¢²»ÊÇ£¬ËüÓо­¹ý¹«ÓõĻ¥ÁªÍø¡£ +VPN 使用公用的互è�”网作为本机构å�„专用网之间的通信载体。专用指机构内的主机å�ªä¸Žæœ¬æœºæž„内的其它主机通信;虚拟指“好åƒ�是â€�,而实际上并ä¸�是,它有ç»�过公用的互è�”网。 -ÏÂͼÖУ¬³¡Ëù A ºÍ B µÄͨÐŲ¿¾­¹ý»¥ÁªÍø£¬Èç¹û³¡Ëù A µÄÖ÷»ú X ÒªºÍÁíÒ»¸ö³¡Ëù B µÄÖ÷»ú Y ͨÐÅ£¬IP Êý¾Ý±¨µÄÔ´µØÖ·ÊÇ 10.1.0.1£¬Ä¿µÄµØÖ·ÊÇ 10.2.0.3¡£Êý¾Ý±¨ÏÈ·¢Ë͵½Ó뻥ÁªÍøÏàÁ¬µÄ·ÓÉÆ÷ R1£¬R1 ¶ÔÄÚ²¿Êý¾Ý½øÐмÓÃÜ£¬È»ºóÖØÐ¼ÓÉÏÊý¾Ý±¨µÄÊײ¿£¬Ô´µØÖ·ÊÇ·ÓÉÆ÷ R1 µÄÈ«ÇòµØÖ· 125.1.2.3£¬Ä¿µÄµØÖ·ÊÇ·ÓÉÆ÷ R2 µÄÈ«ÇòµØÖ· 194.4.5.6¡£Â·ÓÉÆ÷ R2 ÊÕµ½Êý¾Ý±¨ºó½«Êý¾Ý²¿·Ö½øÐнâÃÜ£¬»Ö¸´Ô­À´µÄÊý¾Ý±¨£¬´ËʱĿµÄµØÖ·Îª 10.2.0.3£¬¾Í½»¸¶¸ø Y¡£ +下图中,场所 A å’Œ B 的通信部ç»�过互è�”网,如果场所 A 的主机 X è¦�å’Œå�¦ä¸€ä¸ªåœºæ‰€ B 的主机 Y 通信,IP æ•°æ�®æŠ¥çš„æº�地å�€æ˜¯ 10.1.0.1,目的地å�€æ˜¯ 10.2.0.3。数æ�®æŠ¥å…ˆå�‘é€�到与互è�”网相连的路由器 R1,R1 对内部数æ�®è¿›è¡ŒåŠ å¯†ï¼Œç„¶å�Žé‡�新加上数æ�®æŠ¥çš„首部,æº�地å�€æ˜¯è·¯ç”±å™¨ R1 的全ç�ƒåœ°å�€ 125.1.2.3,目的地å�€æ˜¯è·¯ç”±å™¨ R2 的全ç�ƒåœ°å�€ 194.4.5.6。路由器 R2 收到数æ�®æŠ¥å�Žå°†æ•°æ�®éƒ¨åˆ†è¿›è¡Œè§£å¯†ï¼Œæ�¢å¤�原æ�¥çš„æ•°æ�®æŠ¥ï¼Œæ­¤æ—¶ç›®çš„地å�€ä¸º 10.2.0.3,就交付给 Y。 ![](https://github.com/CyC2018/InterviewNotes/blob/master/pics/bf4ed077-d481-4db7-9e7a-85d841a5a8c3.jpg) -## ÍøÂçµØÖ·×ª»» NAT +## 网络地å�€è½¬æ�¢ NAT -רÓÃÍøÄÚ²¿µÄÖ÷»úʹÓñ¾µØ IP µØÖ·ÓÖÏëºÍ»¥ÁªÍøÉϵÄÖ÷»úͨÐÅʱ£¬¿ÉÒÔʹÓà NAT À´½«±¾µØ IP ת»»ÎªÈ«Çò IP¡£ +专用网内部的主机使用本地 IP 地å�€å�ˆæƒ³å’Œäº’è�”网上的主机通信时,å�¯ä»¥ä½¿ç”¨ NAT æ�¥å°†æœ¬åœ° IP 转æ�¢ä¸ºå…¨ç�ƒ IP。 -ÔÚÒÔǰ£¬NAT ½«±¾µØ IP ºÍÈ«Çò IP Ò»Ò»¶ÔÓ¦£¬ÕâÖÖ·½Ê½ÏÂÓµÓÐ n ¸öÈ«Çò IP µØÖ·µÄרÓÃÍøÄÚ×î¶àÖ»¿ÉÒÔͬʱÓÐ n ̨Ö÷»ú½ÓÈ뻥ÁªÍø¡£ÎªÁ˸üÓÐЧµØÀûÓÃÈ«Çò IP µØÖ·£¬ÏÖÔÚ³£ÓÃµÄ NAT ת»»±í°ÑÔËÊä²ãµÄ¶Ë¿ÚºÅÒ²ÓÃÉÏÁË£¬Ê¹µÃ¶à¸öרÓÃÍøÄÚ²¿µÄÖ÷»ú¹²ÓÃÒ»¸öÈ«Çò IP µØÖ·¡£Ê¹ÓÃ¶Ë¿ÚºÅµÄ NAT Ò²½Ð×öÍøÂçµØÖ·Óë¶Ë¿Úת»» NAPT¡£ +在以å‰�,NAT 将本地 IP 和全ç�ƒ IP 一一对应,这ç§�æ–¹å¼�下拥有 n 个全ç�ƒ IP 地å�€çš„专用网内最多å�ªå�¯ä»¥å�Œæ—¶æœ‰ n å�°ä¸»æœºæŽ¥å…¥äº’è�”网。为了更有效地利用全ç�ƒ IP 地å�€ï¼ŒçŽ°åœ¨å¸¸ç”¨çš„ NAT 转æ�¢è¡¨æŠŠè¿�输层的端å�£å�·ä¹Ÿç”¨ä¸Šäº†ï¼Œä½¿å¾—多个专用网内部的主机共用一个全ç�ƒ IP 地å�€ã€‚使用端å�£å�·çš„ NAT 也å�«å�šç½‘络地å�€ä¸Žç«¯å�£è½¬æ�¢ NAPT。 ![](https://github.com/CyC2018/InterviewNotes/blob/master/pics/0f31bc7a-d60b-48a6-8e3f-597708369e52.png) -# µÚÎåÕ ÔËÊä²ã* +# 第五章 è¿�输层* -ÍøÂç²ãÖ»°Ñ·Ö×é·¢Ë͵½Ä¿µÄÖ÷»ú£¬µ«ÊÇÕæÕýͨÐŵIJ¢²»ÊÇÖ÷»ú¶øÊÇÖ÷»úÖеĽø³Ì¡£ +网络层å�ªæŠŠåˆ†ç»„å�‘é€�到目的主机,但是真正通信的并ä¸�是主机而是主机中的进程。 -ÔËÊä²ãÌṩÁËÓ¦Óýø³Ì¼äµÄÂß¼­Í¨ÐÅ¡£ÔËÊä²ãÏò¸ß²ãÓû§ÆÁ±ÎÁËÏÂÃæÍøÂç²ãµÄºËÐÄϸ½Ú£¬Ê¹Ó¦ÓóÌÐò¿´¼ûµÄºÃÏñÔÚÁ½¸öÔËÊä²ãʵÌåÖ®¼äÓÐÒ»Ìõ¶Ëµ½¶ËµÄÂß¼­Í¨ÐÅÐŵÀ¡£ +è¿�输层æ��供了应用进程间的逻辑通信。è¿�输层å�‘高层用户å±�蔽了下é�¢ç½‘络层的核心细节,使应用程åº�看è§�的好åƒ�在两个è¿�输层实体之间有一æ�¡ç«¯åˆ°ç«¯çš„逻辑通信信é�“。 -## UDP ºÍ TCP µÄÌØµã +多路分解:将è¿�输层数æ�®æ­£ç¡®å�‘给相对应的进程。 -- Óû§Êý¾Ý°üЭÒé UDP£¨User Datagram Protocol£©ÊÇÎÞÁ¬½ÓµÄ£¬¾¡×î´ó¿ÉÄܽ»¸¶£¬Ã»ÓÐÓµÈû¿ØÖÆ£¬ÃæÏò±¨ÎÄ£¨¶ÔÓÚÓ¦ÓóÌÐò´«ÏÂÀ´µÄ±¨ÎIJ»ºÏ²¢Ò²²»²ð·Ö£¬Ö»ÊÇÌí¼Ó UDP Êײ¿£©¡£ +多路å¤�用:给数æ�®åŠ ä¸Šé¦–éƒ¨ä¿¡æ�¯ï¼Œå½¢æˆ�segment,然å�Žå�‘给网络层。 +## UDP å’Œ TCP 的特点 -- ´«Êä¿ØÖÆÐ­Òé TCP£¨Transmission Control Protocol£© ÊÇÃæÏòÁ¬½ÓµÄ£¬Ìṩ¿É¿¿½»¸¶£¬ÓÐÁ÷Á¿¿ØÖÆ£¬ÓµÈû¿ØÖÆ£¬Ìṩȫ˫¹¤Í¨ÐÅ£¬ÃæÏò×Ö½ÚÁ÷£¨°ÑÓ¦Óò㴫ÏÂÀ´µÄ±¨ÎÄ¿´³É×Ö½ÚÁ÷£¬°Ñ×Ö½ÚÁ÷×éÖ¯³É´óС²»µÈµÄÊý¾Ý¿é£© +- 用户数æ�®åŒ…å��è®® UDP(User Datagram Protocol)是无连接的,尽最大å�¯èƒ½äº¤ä»˜ï¼Œæ²¡æœ‰æ‹¥å¡žæŽ§åˆ¶ï¼Œé�¢å�‘报文(对于应用程åº�传下æ�¥çš„æŠ¥æ–‡ä¸�å�ˆå¹¶ä¹Ÿä¸�拆分,å�ªæ˜¯æ·»åŠ  UDP 首部)。 -## UDP Êײ¿¸ñʽ +- 传输控制å��è®® TCP(Transmission Control Protocol) 是é�¢å�‘连接的,æ��ä¾›å�¯é� äº¤ä»˜ï¼Œæœ‰æµ�é‡�控制,拥塞控制,æ��供全å�Œå·¥é€šä¿¡ï¼Œé�¢å�‘字节æµ�(把应用层传下æ�¥çš„æŠ¥æ–‡çœ‹æˆ�字节æµ�,把字节æµ�组织æˆ�大å°�ä¸�等的数æ�®å�—) + +Since most firewalls are configured to block UDP traffic, using TCP for video and voice traffic lets the traffic though the firewalls. +## UDP 首部格å¼� ![](https://github.com/CyC2018/InterviewNotes/blob/master/pics/bd6c05f3-02ee-4c8a-b374-40c87154a898.jpg) -Êײ¿×Ö¶ÎÖ»ÓÐ 8 ¸ö×Ö½Ú£¬°üÀ¨Ô´¶Ë¿Ú¡¢Ä¿µÄ¶Ë¿Ú¡¢³¤¶È¡¢¼ìÑéºÍ¡£12 ×Ö½ÚµÄαÊײ¿ÊÇΪÁ˼ÆËã¼ìÑéºÍ¶øÁÙʱÌí¼ÓµÄ¡£ +首部字段å�ªæœ‰ 8 个字节,包括æº�端å�£ã€�目的端å�£ã€�长度ã€�检验和。12 字节的伪首部是为了计算检验和而临时添加的。 -## TCP Êײ¿¸ñʽ +## TCP 首部格å¼� ![](https://github.com/CyC2018/InterviewNotes/blob/master/pics/21a00b02-c0a6-4bcd-9af0-5ec6bb66e34c.jpg) -- **ÐòºÅ** £ºÓÃÓÚ¶Ô×Ö½ÚÁ÷½øÐбàºÅ£¬ÀýÈçÐòºÅΪ 301£¬±íʾµÚÒ»¸ö×ֽڵıàºÅΪ 301£¬Èç¹ûЯ´øµÄÊý¾Ý³¤¶ÈΪ 100 ×Ö½Ú£¬ÄÇôÏÂÒ»¸ö±¨ÎĶεÄÐòºÅӦΪ 401¡£ +- **åº�å�·** :用于对字节æµ�进行编å�·ï¼Œä¾‹å¦‚åº�å�·ä¸º 301,表示第一个字节的编å�·ä¸º 301,如果æ�ºå¸¦çš„æ•°æ�®é•¿åº¦ä¸º 100 字节,那么下一个报文段的åº�å�·åº”为 401。 -- **È·ÈϺÅ** £ºÆÚÍûÊÕµ½µÄÏÂÒ»¸ö±¨ÎĶεÄÐòºÅ¡£ÀýÈç B ÕýÈ·ÊÕµ½ A ·¢ËÍÀ´µÄÒ»¸ö±¨ÎĶΣ¬ÐòºÅΪ 501£¬Ð¯´øµÄÊý¾Ý³¤¶ÈΪ 200 ×Ö½Ú£¬Òò´Ë B ÆÚÍûÏÂÒ»¸ö±¨ÎĶεÄÐòºÅΪ 701£¬B ·¢Ë͸ø A µÄÈ·Èϱ¨ÎĶÎÖÐÈ·ÈϺžÍΪ 701¡£ +- **确认å�·** :期望收到的下一个报文段的åº�å�·ã€‚例如 B 正确收到 A å�‘é€�æ�¥çš„一个报文段,åº�å�·ä¸º 501,æ�ºå¸¦çš„æ•°æ�®é•¿åº¦ä¸º 200 字节,因此 B 期望下一个报文段的åº�å�·ä¸º 701,B å�‘é€�ç»™ A 的确认报文段中确认å�·å°±ä¸º 701。 -- **Êý¾ÝÆ«ÒÆ** £ºÖ¸µÄÊÇÊý¾Ý²¿·Ö¾àÀ뱨ÎÄ¶ÎÆðʼ´¦µÄÆ«ÒÆÁ¿£¬Êµ¼ÊÉÏÖ¸µÄÊÇÊײ¿µÄ³¤¶È¡£ +- **æ•°æ�®å��ç§»** :指的是数æ�®éƒ¨åˆ†è·�离报文段起始处的å��ç§»é‡�,实际上指的是首部的长度。 -- **È·ÈÏ ACK** £ºµ± ACK=1 ʱȷÈϺÅ×Ö¶ÎÓÐЧ£¬·ñÔòÎÞЧ¡£TCP ¹æ¶¨£¬ÔÚÁ¬½Ó½¨Á¢ºóËùÓд«Ë͵ı¨ÎĶζ¼±ØÐë°Ñ ACK Öà 1¡£ +- **确认 ACK** :当 ACK=1 时确认å�·å­—段有效,å�¦åˆ™æ— æ•ˆã€‚TCP 规定,在连接建立å�Žæ‰€æœ‰ä¼ é€�的报文段都必须把 ACK ç½® 1。 -- **ͬ²½ SYN** £ºÔÚÁ¬½Ó½¨Á¢Ê±ÓÃÀ´Í¬²½ÐòºÅ¡£µ± SYN=1£¬ACK=0 ʱ±íʾÕâÊÇÒ»¸öÁ¬½ÓÇëÇó±¨ÎĶΡ£Èô¶Ô·½Í¬Ò⽨Á¢Á¬½Ó£¬ÔòÏìÓ¦±¨ÎÄÖÐ SYN=1£¬ACK=1¡£ +- **å�Œæ­¥ SYN** :在连接建立时用æ�¥å�Œæ­¥åº�å�·ã€‚当 SYN=1,ACK=0 时表示这是一个连接请求报文段。若对方å�Œæ„�建立连接,则å“�应报文中 SYN=1,ACK=1。 -- **ÖÕÖ¹ FIN** £ºÓÃÀ´ÊÍ·ÅÒ»¸öÁ¬½Ó£¬µ± FIN=1 ʱ£¬±íʾ´Ë±¨ÎĶεķ¢ËÍ·½µÄÊý¾ÝÒÑ·¢ËÍÍê±Ï£¬²¢ÒªÇóÊÍ·ÅÔËÊäÁ¬½Ó¡£ +- **终止 FIN** :用æ�¥é‡Šæ”¾ä¸€ä¸ªè¿žæŽ¥ï¼Œå½“ FIN=1 时,表示此报文段的å�‘é€�方的数æ�®å·²å�‘é€�完毕,并è¦�求释放è¿�输连接。 -- **´°¿Ú** £º´°¿ÚÖµ×÷Ϊ½ÓÊÕ·½È÷¢ËÍ·½ÉèÖÃÆä·¢ËÍ´°¿ÚµÄÒÀ¾Ý¡£Ö®ËùÒÔÒªÓÐÕâ¸öÏÞÖÆ£¬ÊÇÒòΪ½ÓÊÕ·½µÄÊý¾Ý»º´æ¿Õ¼äÊÇÓÐÏ޵ġ£ +- **窗å�£** :窗å�£å€¼ä½œä¸ºæŽ¥æ”¶æ–¹è®©å�‘é€�方设置其å�‘é€�窗å�£çš„ä¾�æ�®ã€‚之所以è¦�有这个é™�制,是因为接收方的数æ�®ç¼“存空间是有é™�的。 -## TCP µÄÈý´ÎÎÕÊÖ + +MSS 为TCP报文中数æ�®çš„æœ€å¤§é•¿åº¦å¸¸ä¸º1460byte + +MTU 为1500字节是最大传输å�•å…ƒ +## TCP 的三次æ�¡æ‰‹ ![](https://github.com/CyC2018/InterviewNotes/blob/master/pics/086871db-5871-460f-97b7-126cd738bb0e.jpg) -¼ÙÉè A Ϊ¿Í»§¶Ë£¬B Ϊ·þÎñÆ÷¶Ë¡£ +å�‡è®¾ A 为客户端,B 为æœ�务器端。 -1. Ê×ÏÈ B ´¦ÓÚ LISTEN£¨¼àÌý£©×´Ì¬£¬µÈ´ý¿Í»§µÄÁ¬½ÓÇëÇó¡£ -2. A Ïò B ·¢ËÍÁ¬½ÓÇëÇó±¨ÎĶΣ¬SYN=1£¬ACK=0£¬Ñ¡ÔñÒ»¸ö³õʼµÄÐòºÅ x¡£ -3. B ÊÕµ½Á¬½ÓÇëÇó±¨ÎĶΣ¬Èç¹ûͬÒ⽨Á¢Á¬½Ó£¬ÔòÏò A ·¢ËÍÁ¬½ÓÈ·Èϱ¨ÎĶΣ¬SYN=1£¬ACK=1£¬È·ÈϺÅΪ x+1£¬Í¬Ê±Ò²Ñ¡ÔñÒ»¸ö³õʼµÄÐòºÅ y¡£ -4. A ÊÕµ½ B µÄÁ¬½ÓÈ·Èϱ¨ÎĶκ󣬻¹ÒªÏò B ·¢³öÈ·ÈÏ£¬È·ÈϺÅΪ y+1£¬ÐòºÅΪ x+1¡£ -5. B ÊÕµ½ A µÄÈ·ÈϺó£¬Á¬½Ó½¨Á¢¡£ +1. 首先 B 处于 LISTEN(监å�¬ï¼‰çжæ€�,等待客户的连接请求。 +2. A å�‘ B å�‘é€�连接请求报文段,SYN=1,ACK=0,选择一个åˆ�å§‹çš„åº�å�· x。 +3. B 收到连接请求报文段,如果å�Œæ„�建立连接,则å�‘ A å�‘é€�连接确认报文段,SYN=1,ACK=1,确认å�·ä¸º x+1,å�Œæ—¶ä¹Ÿé€‰æ‹©ä¸€ä¸ªåˆ�å§‹çš„åº�å�· y。 +4. A 收到 B 的连接确认报文段å�Žï¼Œè¿˜è¦�å�‘ B å�‘出确认,确认å�·ä¸º y+1,åº�å�·ä¸º x+1。 +5. B 收到 A 的确认å�Žï¼Œè¿žæŽ¥å»ºç«‹ã€‚ -## TCP µÄËĴλÓÊÖ +## TCP 的四次挥手 ![](https://github.com/CyC2018/InterviewNotes/blob/master/pics/78f65456-666b-4044-b4ee-f7692dbbc0d3.jpg) -ÒÔÏÂÃèÊö²»ÌÖÂÛÐòºÅºÍÈ·ÈϺţ¬ÒòΪÐòºÅºÍÈ·ÈϺŵĹæÔò±È½Ï¼òµ¥¡£²¢ÇÒ²»ÌÖÂÛ ACK£¬ÒòΪ ACK ÔÚÁ¬½Ó½¨Á¢Ö®ºó¶¼Îª 1¡£ +以下æ��è¿°ä¸�讨论åº�å�·å’Œç¡®è®¤å�·ï¼Œå› ä¸ºåº�å�·å’Œç¡®è®¤å�·çš„规则比较简å�•。并且ä¸�讨论 ACK,因为 ACK 在连接建立之å�Žéƒ½ä¸º 1。 -1. A ·¢ËÍÁ¬½ÓÊͷű¨ÎĶΣ¬FIN=1£» -2. B ÊÕµ½Ö®ºó·¢³öÈ·ÈÏ£¬´Ëʱ TCP ÊôÓÚ°ë¹Ø±Õ״̬£¬B ÄÜÏò A ·¢ËÍÊý¾Ýµ«ÊÇ A ²»ÄÜÏò B ·¢ËÍÊý¾Ý£» -3. µ± B Òª²»ÔÙÐèÒªÁ¬½Óʱ£¬·¢ËÍÁ¬½ÓÊÍ·ÅÇëÇó±¨ÎĶΣ¬FIN=1£» -4. A ÊÕµ½ºó·¢³öÈ·ÈÏ£¬´ËʱÁ¬½ÓÊÍ·Å¡£ +1. A å�‘é€�连接释放报文段,FIN=1ï¼› +2. B 收到之å�Žå�‘出确认,此时 TCP 属于å�Šå…³é—­çжæ€�,B 能å�‘ A å�‘é€�æ•°æ�®ä½†æ˜¯ A ä¸�能å�‘ B å�‘é€�æ•°æ�®ï¼› +3. 当 B è¦�ä¸�å†�需è¦�连接时,å�‘é€�连接释放请求报文段,FIN=1ï¼› +4. A 收到å�Žå�‘出确认,此时连接释放。 **TIME_WAIT** -¿Í»§¶Ë½ÓÊÕµ½·þÎñÆ÷¶ËµÄ FIN ±¨Îĺó½øÈë´Ë״̬£¬´Ëʱ²¢²»ÊÇÖ±½Ó½øÈë CLOSED ״̬£¬»¹ÐèÒªµÈ´ýÒ»¸öʱ¼ä¼ÆÊ±Æ÷ÉèÖõÄʱ¼ä¡£Õâô×öÓÐÁ½¸öÀíÓÉ£º +客户端接收到æœ�务器端的 FIN 报文å�Žè¿›å…¥æ­¤çжæ€�,此时并ä¸�是直接进入 CLOSED 状æ€�,还需è¦�等待一个时间计时器设置的时间。这么å�šæœ‰ä¸¤ä¸ªç�†ç”±ï¼š -1. È·±£×îºóÒ»¸öÈ·Èϱ¨ÎĶÎÄܹ»µ½´ï¡£Èç¹û B ûÊÕµ½ A ·¢ËÍÀ´µÄÈ·Èϱ¨ÎĶΣ¬ÄÇô¾Í»áÖØÐ·¢ËÍÁ¬½ÓÊÍ·ÅÇëÇó±¨ÎĶΣ¬A µÈ´ýÒ»¶Îʱ¼ä¾ÍÊÇΪÁË´¦ÀíÕâÖÖÇé¿öµÄ·¢Éú¡£ -2. ¿ÉÄÜ´æÔÚ¡°ÒÑʧЧµÄÁ¬½ÓÇëÇó±¨ÎĶΡ±£¬ÎªÁË·ÀÖ¹ÕâÖÖ±¨ÎĶγöÏÖÔÚ±¾´ÎÁ¬½ÓÖ®Í⣬ÐèÒªµÈ´ýÒ»¶Îʱ¼ä¡£ +1. ç¡®ä¿�最å�Žä¸€ä¸ªç¡®è®¤æŠ¥æ–‡æ®µèƒ½å¤Ÿåˆ°è¾¾ã€‚如果 B 没收到 A å�‘é€�æ�¥çš„确认报文段,那么就会é‡�æ–°å�‘é€�连接释放请求报文段,A 等待一段时间就是为了处ç�†è¿™ç§�情况的å�‘生。 +2. å�¯èƒ½å­˜åœ¨â€œå·²å¤±æ•ˆçš„连接请求报文段â€�,为了防止这ç§�报文段出现在本次连接之外,需è¦�等待一段时间。 -## TCP »¬¶¯´°¿Ú +## TCP 滑动窗å�£ ![](https://github.com/CyC2018/InterviewNotes/blob/master/pics/223fc26e-2fd6-484c-bcb7-443cac134f15.jpg) -´°¿ÚÊÇ»º´æµÄÒ»²¿·Ö£¬ÓÃÀ´ÔÝʱ´æ·Å×Ö½ÚÁ÷¡£·¢ËÍ·½ºÍ½ÓÊÕ·½¸÷ÓÐÒ»¸ö´°¿Ú£¬½ÓÊÕ·½Í¨¹ý TCP ±¨ÎĶÎÖеĴ°¿Ú×ֶθæËß·¢ËÍ·½×Ô¼ºµÄ´°¿Ú´óС£¬·¢ËÍ·½¸ù¾ÝÕâ¸öÖµºÍÆäËüÐÅÏ¢ÉèÖÃ×Ô¼ºµÄ´°¿Ú´óС¡£ +窗å�£æ˜¯ç¼“存的一部分,用æ�¥æš‚时存放字节æµ�。å�‘é€�方和接收方å�„有一个窗å�£ï¼ŒæŽ¥æ”¶æ–¹é€šè¿‡ TCP 报文段中的窗å�£å­—段告诉å�‘é€�方自己的窗å�£å¤§å°�,å�‘é€�方根æ�®è¿™ä¸ªå€¼å’Œå…¶å®ƒä¿¡æ�¯è®¾ç½®è‡ªå·±çš„窗å�£å¤§å°�。 -·¢ËÍ´°¿ÚÄÚµÄ×Ö½Ú¶¼ÔÊÐí±»·¢ËÍ£¬½ÓÊÕ´°¿ÚÄÚµÄ×Ö½Ú¶¼ÔÊÐí±»½ÓÊÕ¡£Èç¹û·¢ËÍ´°¿Ú×󲿵Ä×Ö½ÚÒѾ­·¢ËͲ¢ÇÒÊÕµ½ÁËÈ·ÈÏ£¬ÄÇô¾Í½«·¢ËÍ´°¿ÚÏòÓÒ»¬¶¯Ò»¶¨¾àÀ룬ֱµ½×󲿵ÚÒ»¸ö×Ö½Ú²»ÊÇÒÑ·¢ËͲ¢ÇÒÒÑÈ·ÈϵÄ״̬£»½ÓÊÕ´°¿ÚµÄ»¬¶¯ÀàËÆ£¬½ÓÊÕ´°¿Ú×ó²¿×Ö½ÚÒѾ­·¢ËÍÈ·Èϲ¢½»¸¶Ö÷»ú£¬¾ÍÏòÓÒ»¬¶¯½ÓÊÕ´°¿Ú¡£ +å�‘é€�窗å�£å†…的字节都å…�许被å�‘é€�,接收窗å�£å†…的字节都å…�许被接收。如果å�‘é€�窗å�£å·¦éƒ¨çš„字节已ç»�å�‘é€�并且收到了确认,那么就将å�‘é€�窗å�£å�‘å�³æ»‘动一定è·�离,直到左部第一个字节ä¸�是已å�‘é€�并且已确认的状æ€�;接收窗å�£çš„æ»‘动类似,接收窗å�£å·¦éƒ¨å­—节已ç»�å�‘é€�确认并交付主机,就å�‘å�³æ»‘动接收窗å�£ã€‚ -½ÓÊÕ´°¿ÚÖ»»á¶Ô´°¿ÚÄÚ×îºóÒ»¸ö°´Ðòµ½´ïµÄ×Ö½Ú½øÐÐÈ·ÈÏ£¬ÀýÈç½ÓÊÕ´°¿ÚÒѾ­ÊÕµ½µÄ×Ö½ÚΪ {31, 32, 34, 35}£¬ÆäÖÐ {31, 32} °´Ðòµ½´ï£¬¶ø {34, 35} ¾Í²»ÊÇ£¬Òò´ËÖ»¶Ô×Ö½Ú 32 ½øÐÐÈ·ÈÏ¡£·¢ËÍ·½µÃµ½Ò»¸ö×Ö½ÚµÄÈ·ÈÏÖ®ºó£¬¾ÍÖªµÀÕâ¸ö×Ö½Ú֮ǰµÄËùÓÐ×Ö½Ú¶¼ÒѾ­±»½ÓÊÕ¡£ +接收窗å�£å�ªä¼šå¯¹çª—å�£å†…最å�Žä¸€ä¸ªæŒ‰åº�到达的字节进行确认,例如接收窗å�£å·²ç»�收到的字节为 {31, 32, 34, 35},其中 {31, 32} 按åº�到达,而 {34, 35} å°±ä¸�是,因此å�ªå¯¹å­—节 32 进行确认。**å�‘é€�方得到一个字节的确认之å�Žï¼Œå°±çŸ¥é�“这个字节之å‰�的所有字节都已ç»�被接收。累积ACK** -## TCP ¿É¿¿´«Êä +在探讨å�¯é� æ•°æ�®ä¼ è¾“的过程中,为了解决æµ�水线传输下的丢包问题,æ��出了GBNå��议和SRå��è®® +### GBN +一旦å�‘生错误,丢弃已近接收到好的包,回到第N步之å‰� -TCP ʹÓó¬Ê±ÖØ´«À´ÊµÏÖ¿É¿¿´«Ê䣺Èç¹ûÒ»¸öÒѾ­·¢Ë͵ı¨ÎĶÎÔÚ³¬Ê±Ê±¼äÄÚûÓÐÊÕµ½È·ÈÏ£¬ÄÇô¾ÍÖØ´«Õâ¸ö±¨ÎĶΡ£ +GBN 采用累积ACK -Ò»¸ö±¨ÎĶδӷ¢ËÍÔÙµ½½ÓÊÕµ½È·ÈÏËù¾­¹ýµÄʱ¼ä³ÆÎªÍù·µÊ±¼ä RTT£¬¼ÓȨƽ¾ùÍù·µÊ±¼ä RTTs ¼ÆËãÈçÏ£º +窗å�£é•¿åº¦å¿…é¡»å°�于åº�å�·ç©ºé—´å¤§å°� + +优点:接收缓存简å�• +### SR +选择é‡�ä¼  + +窗å�£é•¿åº¦å¿…é¡»å°�于等于åº�å�·ç©ºé—´å¤§å°�的一å�Š +**TCP采用的ä¸�是GBN也ä¸�是SR,而是一ç§�更优的方案** +## TCP å�¯é� ä¼ è¾“ + +TCP 使用超时é‡�ä¼ æ�¥å®žçްå�¯é� ä¼ è¾“:如果一个已ç»�å�‘é€�的报文段在超时时间内没有收到确认,那么就é‡�传这个报文段。 + +一个报文段从å�‘é€�å†�到接收到确认所ç»�过的时间称为往返时间 RTT,加æ�ƒå¹³å�‡å¾€è¿”æ—¶é—´ RTTs 计算如下: ![](http://latex.codecogs.com/gif.latex?\\\\RTTs=(1-a)*(RTTs)+a*RTT) -³¬Ê±Ê±¼ä RTO Ó¦¸ÃÂÔ´óÓÚ RRTs£¬TCP ʹÓõij¬Ê±Ê±¼ä¼ÆËãÈçÏ£º +è¶…æ—¶æ—¶é—´ RTO 应该略大于 RRTs,TCP 使用的超时时间计算如下: ![](http://latex.codecogs.com/gif.latex?\\\\RTO=RTTs+4*RTT_d) -ÆäÖÐ RTTd Ϊƫ²î£¬ËüÓëÐ嵀 RRT ºÍ RRTs Óйء£ +其中 RTTd 为å��差,它与新的 RRT å’Œ RRTs 有关。 -## TCP Á÷Á¿¿ØÖÆ +## TCP æµ�é‡�控制 -Á÷Á¿¿ØÖÆÊÇΪÁË¿ØÖÆ·¢ËÍ·½·¢ËÍËÙÂÊ£¬±£Ö¤½ÓÊÕ·½À´µÃ¼°½ÓÊÕ¡£ +æµ�é‡�控制是为了控制å�‘é€�æ–¹å�‘é€�速率,ä¿�è¯�接收方æ�¥å¾—å�ŠæŽ¥æ”¶ã€‚ -½ÓÊÕ·½·¢Ë͵ÄÈ·Èϱ¨ÎÄÖеĴ°¿Ú×ֶοÉÒÔÓÃÀ´¿ØÖÆ·¢ËÍ·½´°¿Ú´óС£¬´Ó¶øÓ°Ïì·¢ËÍ·½µÄ·¢ËÍËÙÂÊ¡£ÀýÈ罫´°¿Ú×Ö¶ÎÉèÖÃΪ 0£¬Ôò·¢ËÍ·½²»ÄÜ·¢ËÍÊý¾Ý¡£ +接收方å�‘é€�的确认报文中的窗å�£å­—段å�¯ä»¥ç”¨æ�¥æŽ§åˆ¶å�‘é€�方窗å�£å¤§å°�,从而影å“�å�‘é€�方的å�‘é€�速率。例如将窗å�£å­—段设置为 0,则å�‘é€�æ–¹ä¸�能å�‘é€�æ•°æ�®ã€‚ -## TCP ÓµÈû¿ØÖÆ +## TCP 拥塞控制 -Èç¹ûÍøÂç³öÏÖÓµÈû£¬·Ö×齫»á¶ªÊ§£¬´Ëʱ·¢ËÍ·½»á¼ÌÐøÖØ´«£¬´Ó¶øµ¼ÖÂÍøÂçÓµÈû³Ì¶È¸ü¸ß¡£Òò´Ëµ±³öÏÖÓµÈûʱ£¬Ó¦µ±¿ØÖÆ·¢ËÍ·½µÄËÙÂÊ¡£ÕâÒ»µãºÍÁ÷Á¿¿ØÖƺÜÏñ£¬µ«Êdzö·¢µã²»Í¬¡£Á÷Á¿¿ØÖÆÊÇΪÁËÈýÓÊÕ·½ÄÜÀ´µÃ¼°½ÓÊÜ£¬¶øÓµÈû¿ØÖÆÊÇΪÁ˽µµÍÕû¸öÍøÂçµÄÓµÈû³Ì¶È¡£ +如果网络出现拥塞,分组将会丢失,此时å�‘é€�方会继续é‡�传,从而导致网络拥塞程度更高。因此当出现拥塞时,应当控制å�‘é€�方的速率。这一点和æµ�é‡�控制很åƒ�,但是出å�‘点ä¸�å�Œã€‚æµ�é‡�控制是为了让接收方能æ�¥å¾—å�пޥå�—,而拥塞控制是为了é™�低整个网络的拥塞程度。 ![](https://github.com/CyC2018/InterviewNotes/blob/master/pics/a69af9bb-b5ad-4896-862d-697e5ee4feb1.png) -TCP Ö÷Ҫͨ¹ýËÄÖÖËã·¨À´½øÐÐÓµÈû¿ØÖÆ£ºÂý¿ªÊ¼¡¢ÓµÈû±ÜÃâ¡¢¿ìÖØ´«¡¢¿ì»Ö¸´¡£·¢ËÍ·½ÐèҪά»¤ÓÐÒ»¸ö½Ð×öÓµÈû´°¿Ú£¨cwnd£©µÄ״̬±äÁ¿¡£×¢ÒâÓµÈû´°¿ÚÓë·¢ËÍ·½´°¿ÚµÄÇø±ð£¬ÓµÈû´°¿ÚÖ»ÊÇÒ»¸ö״̬±äÁ¿£¬Êµ¼Ê¾ö¶¨·¢ËÍ·½ÄÜ·¢ËͶàÉÙÊý¾ÝµÄÊÇ·¢ËÍ·½´°¿Ú¡£ +TCP 主è¦�通过四ç§�算法æ�¥è¿›è¡Œæ‹¥å¡žæŽ§åˆ¶ï¼šæ…¢å¼€å§‹ã€�拥塞é�¿å…�ã€�å¿«é‡�ä¼ ã€�å¿«æ�¢å¤�。å�‘é€�方需è¦�维护有一个å�«å�šæ‹¥å¡žçª—å�£ï¼ˆcwnd)的状æ€�å�˜é‡�。注æ„�拥塞窗å�£ä¸Žå�‘é€�方窗å�£çš„区别,拥塞窗å�£å�ªæ˜¯ä¸€ä¸ªçжæ€�å�˜é‡�,实际决定å�‘é€�方能å�‘é€�多少数æ�®çš„æ˜¯å�‘é€�方窗å�£ã€‚ -ΪÁ˱ãÓÚÌÖÂÛ£¬×öÈçϼÙÉ裺 +为了便于讨论,å�šå¦‚下å�‡è®¾ï¼š -1. ½ÓÊÕ·½ÓÐ×ã¹»´óµÄ½ÓÊÕ»º´æ£¬Òò´Ë²»»á·¢ÉúÁ÷Á¿¿ØÖÆ£» -2. ËäÈ» TCP µÄ´°¿Ú»ùÓÚ×Ö½Ú£¬µ«ÊÇÕâÀïÉè´°¿ÚµÄ´óСµ¥Î»Îª±¨ÎĶΡ£ +1. 接收方有足够大的接收缓存,因此ä¸�会å�‘生æµ�é‡�控制; +2. 虽然 TCP 的窗å�£åŸºäºŽå­—节,但是这里设窗å�£çš„大å°�å�•ä½�为报文段。 ![](https://github.com/CyC2018/InterviewNotes/blob/master/pics/346244ff-98c1-4f12-9a87-d0832e8c04cf.jpg) -### Âý¿ªÊ¼ÓëÓµÈû±ÜÃâ +### 慢开始与拥塞é�¿å…� -·¢Ë͵Ä×î³õÖ´ÐÐÂý¿ªÊ¼£¬Áî cwnd=1£¬·¢ËÍ·½Ö»ÄÜ·¢ËÍ 1 ¸ö±¨ÎĶΣ»µ±ÊÕµ½È·ÈϺ󣬽« cwnd ¼Ó±¶£¬Òò´ËÖ®ºó·¢ËÍ·½Äܹ»·¢Ë͵ı¨ÎĶÎΪ£º2¡¢4¡¢8 ... +å�‘é€�的最åˆ�执行慢开始,令 cwnd=1,å�‘é€�æ–¹å�ªèƒ½å�‘é€� 1 个报文段;当收到确认å�Žï¼Œå°† cwnd 加å€�,因此之å�Žå�‘é€�方能够å�‘é€�的报文段为:2ã€�4ã€�8 ... -×¢Òâµ½Âý¿ªÊ¼Ã¿¸öÂִζ¼½« cwnd ¼Ó±¶£¬ÕâÑù»áÈà cwnd Ôö³¤Ëٶȷdz£¿ì£¬´Ó¶øÊ¹µÃ·¢ËÍ·½·¢Ë͵ÄËÙ¶ÈÔö³¤Ëٶȹý¿ì£¬ÍøÂçÓµÈûµÄ¿ÉÄÜÒ²¾Í¸ü¸ß¡£ÉèÖÃÒ»¸öÂý¿ªÊ¼ÃÅÏÞ ssthresh£¬µ± cwnd >= ssthresh ʱ£¬½øÈëÓµÈû±ÜÃ⣬ÿ¸öÂÖ´ÎÖ»½« cwnd ¼Ó 1¡£ +注æ„�到慢开始æ¯�个轮次都将 cwnd 加å€�,这样会让 cwnd 增长速度é�žå¸¸å¿«ï¼Œä»Žè€Œä½¿å¾—å�‘é€�æ–¹å�‘é€�的速度增长速度过快,网络拥塞的å�¯èƒ½ä¹Ÿå°±æ›´é«˜ã€‚设置一个慢开始门é™� ssthresh,当 cwnd >= ssthresh 时,进入拥塞é�¿å…�,æ¯�个轮次å�ªå°† cwnd 加 1。 -Èç¹û³öÏÖÁ˳¬Ê±£¬ÔòÁî ssthresh = cwnd / 2£¬È»ºóÖØÐÂÖ´ÐÐÂý¿ªÊ¼¡£ +如果出现了超时,则令 ssthresh = cwnd / 2,然å�Žé‡�新执行慢开始。 -### ¿ìÖØ´«Óë¿ì»Ö¸´ +### å¿«é‡�传与快æ�¢å¤� -ÔÚ½ÓÊÕ·½£¬ÒªÇóÿ´Î½ÓÊÕµ½±¨ÎĶζ¼Ó¦¸Ã·¢ËͶÔÒÑÊÕµ½ÓÐÐò±¨ÎĶεÄÈ·ÈÏ£¬ÀýÈçÒѾ­½ÓÊÕµ½ M1 ºÍ M2£¬´ËʱÊÕµ½ M4£¬Ó¦µ±·¢ËÍ¶Ô M2 µÄÈ·ÈÏ¡£ +在接收方,è¦�求æ¯�次接收到报文段都应该å�‘é€�对已收到有åº�报文段的确认,例如已ç»�接收到 M1 å’Œ M2,此时收到 M4,应当å�‘é€�对 M2 的确认。 -ÔÚ·¢ËÍ·½£¬Èç¹ûÊÕµ½Èý¸öÖØ¸´È·ÈÏ£¬ÄÇô¿ÉÒÔÈ·ÈÏÏÂÒ»¸ö±¨ÎĶζªÊ§£¬ÀýÈçÊÕµ½Èý¸ö M2 £¬Ôò M3 ¶ªÊ§¡£´ËʱִÐпìÖØ´«£¬Á¢¼´ÖØ´«ÏÂÒ»¸ö±¨ÎĶΡ£ +在å�‘é€�方,如果收到三个é‡�å¤�确认,那么å�¯ä»¥ç¡®è®¤ä¸‹ä¸€ä¸ªæŠ¥æ–‡æ®µä¸¢å¤±ï¼Œä¾‹å¦‚收到三个 M2 ,则 M3 丢失。此时执行快é‡�传,立å�³é‡�传下一个报文段。 -ÔÚÕâÖÖÇé¿öÏ£¬Ö»ÊǶªÊ§¸ö±ð±¨ÎĶΣ¬¶ø²»ÊÇÍøÂçÓµÈû£¬Òò´ËÖ´Ðпì»Ö¸´£¬Áî ssthresh = cwnd / 2 £¬cwnd = ssthresh£¬×¢Òâµ½´Ëʱֱ½Ó½øÈëÓµÈû±ÜÃâ¡£ +在这ç§�情况下,å�ªæ˜¯ä¸¢å¤±ä¸ªåˆ«æŠ¥æ–‡æ®µï¼Œè€Œä¸�是网络拥塞,因此执行快æ�¢å¤�,令 ssthresh = cwnd / 2 ,cwnd = ssthresh,注æ„�到此时直接进入拥塞é�¿å…�。 ![](https://github.com/CyC2018/InterviewNotes/blob/master/pics/b18d679b-c8e2-4564-88ee-7600090e46da.jpg) -# µÚÁùÕ ӦÓòã* +![](https://github.com/xbhoneybee/InterviewNotes/blob/master/pics/TIM%E6%88%AA%E5%9B%BE20180227172950.png?raw=true) +# 第六章 应用层* -## ÓòÃûϵͳ DNS +一个程åº�å�¯ä»¥å�Šæ”¯æŒ�TCPå�ˆæ”¯æŒ�UDPå��议,但是程åº�之间的连接必须使用相å�Œçš„å��议。 +## 域å��系统 DNS -°ÑÖ÷»úÃû½âÎöΪ IP µØÖ·¡£ +把主机å��è§£æž�为 IP 地å�€ã€‚ -±»Éè¼Æ³É·Ö²¼Ê½ÏµÍ³¡£ +被设计æˆ�分布å¼�系统。 -### 1. ²ã´Î½á¹¹ +### 1. 层次结构 -Ò»¸öÓòÃûÓɶà¸ö²ã´Î¹¹³É£¬´ÓÉϲ㵽ϲã·Ö±ðΪ¶¥¼¶ÓòÃû¡¢¶þ¼¶ÓòÃû¡¢Èý¼¶ÓòÃûÒÔ¼°Ëļ¶ÓòÃû¡£ËùÓÐÓòÃû¿ÉÒÔ»­³ÉÒ»¿ÅÓòÃûÊ÷¡£ +一个域å��由多个层次构æˆ�,从上层到下层分别为顶级域å��ã€�二级域å��ã€�三级域å��以å�Šå››çº§åŸŸå��。所有域å��å�¯ä»¥ç”»æˆ�一颗域å��树。 ![](https://github.com/CyC2018/InterviewNotes/blob/master/pics/c2117f61-1177-4768-bf33-cf4f950d911c.png) ![](https://github.com/CyC2018/InterviewNotes/blob/master/pics/a4b162e5-db2a-4a27-b213-1fe481c5a06a.png) -ÓòÃû·þÎñÆ÷¿ÉÒÔ·ÖΪÒÔÏÂËÄÀࣺ +域å��æœ�务器å�¯ä»¥åˆ†ä¸ºä»¥ä¸‹å››ç±»ï¼š -1. ¸ùÓòÃû·þÎñÆ÷£º½âÎö¶¥¼¶ÓòÃû£» -2. ¶¥¼¶ÓòÃû·þÎñÆ÷£º½âÎö¶þ¼¶ÓòÃû£» -3. ȨÏÞÓòÃû·þÎñÆ÷£º½âÎöÇøÄÚµÄÓòÃû£» -4. ±¾µØÓòÃû·þÎñÆ÷£ºÒ²³ÆÎªÄ¬ÈÏÓòÃû·þÎñÆ÷¡£¿ÉÒÔÔÚÆäÖÐÅäÖøßËÙ»º´æ¡£ +1. 根域å��æœ�务器:解æž�顶级域å��ï¼› +2. 顶级域å��æœ�务器:解æž�二级域å��ï¼› +3. æ�ƒé™�域å��æœ�务器:解æž�区内的域å��ï¼› +4. 本地域å��æœ�务器:也称为默认域å��æœ�务器。å�¯ä»¥åœ¨å…¶ä¸­é…�置高速缓存。 -ÇøºÍÓòµÄ¸ÅÄͬ£¬¿ÉÒÔÔÚÒ»¸öÓòÖл®·Ö¶à¸öÇø¡£Í¼ b ÔÚÓò abc.com Öл®·ÖÁËÁ½¸öÇø£ºabc.com ºÍ y.abc.com +区和域的概念ä¸�å�Œï¼Œå�¯ä»¥åœ¨ä¸€ä¸ªåŸŸä¸­åˆ’分多个区。图 b 在域 abc.com 中划分了两个区:abc.com å’Œ y.abc.com ![](https://github.com/CyC2018/InterviewNotes/blob/master/pics/fc0c6b2d-68c7-4de8-aaaa-97355a4f0472.jpg) -Òò´Ë¾ÍÐèÒªÁ½¸öȨÏÞÓòÃû·þÎñÆ÷£º +因此就需è¦�两个æ�ƒé™�域å��æœ�务器: ![](https://github.com/CyC2018/InterviewNotes/blob/master/pics/8b335d94-c1ca-42e1-ad48-bb179d28a4f1.jpg) -### 2. ½âÎö¹ý³Ì +### 2. è§£æž�过程 -Ö÷»úÏò±¾µØÓòÃû·þÎñÆ÷½âÎöµÄ¹ý³Ì²ÉÓõݹ飬¶ø±¾µØÓòÃû·þÎñÆ÷ÏòÆäËüÓòÃû·þÎñÆ÷½âÎö¿ÉÒÔʹÓõݹéºÍµü´úÁ½ÖÖ·½Ê½¡£ +主机å�‘本地域å��æœ�务器解æž�的过程采用递归,而本地域å��æœ�务器å�‘其它域å��æœ�务器解æž�å�¯ä»¥ä½¿ç”¨é€’归和迭代两ç§�æ–¹å¼�。 -µü´úµÄ·½Ê½Ï£¬±¾µØÓòÃû·þÎñÆ÷ÏòÒ»¸öÓòÃû·þÎñÆ÷½âÎöÇëÇó½âÎöÖ®ºó£¬½á¹û·µ»Øµ½±¾µØÓòÃû·þÎñÆ÷£¬È»ºó±¾µØÓòÃû·þÎñÆ÷¼ÌÐøÏòÆäËüÓòÃû·þÎñÆ÷ÇëÇó½âÎö£»¶øµÝ¹éµØ·½Ê½Ï£¬½á¹û²»ÊÇÖ±½Ó·µ»ØµÄ£¬¶øÊǼÌÐøÏòǰÇëÇó½âÎö£¬×îºóµÄ½á¹û²Å»á·µ»Ø¡£ +迭代的方å¼�下,本地域å��æœ�务器å�‘一个域å��æœ�务器解æž�请求解æž�之å�Žï¼Œç»“果返回到本地域å��æœ�务器,然å�Žæœ¬åœ°åŸŸå��æœ�务器继续å�‘其它域å��æœ�务器请求解æž�;而递归地方å¼�下,结果ä¸�是直接返回的,而是继续å�‘å‰�请求解æž�,最å�Žçš„结果æ‰�会返回。 ![](https://github.com/CyC2018/InterviewNotes/blob/master/pics/6bc61bb8-3b1c-4dc8-ac25-cef925ace0eb.jpg) -## Îļþ´«ÊäЭÒé FTP +## 文件传输å��è®® FTP -FTP ÔÚÔËÊä²ãʹÓà TCP£¬²¢ÇÒÐèÒª½¨Á¢Á½¸ö²¢ÐÐµÄ TCP Á¬½Ó£º¿ØÖÆÁ¬½ÓºÍÊý¾ÝÁ¬½Ó¡£¿ØÖÆÁ¬½ÓÔÚÕû¸ö»á»°ÆÚ¼äÒ»Ö±±£³Ö´ò¿ª£¬¶øÊý¾ÝÁ¬½ÓÔÚÊý¾Ý´«ËÍÍê±ÏÖ®ºó¾Í¹Ø±Õ¡£¿ØÖÆÁ¬½ÓʹÓö˿ںŠ21£¬Êý¾ÝÁ¬½ÓʹÓö˿ںŠ20¡£ +FTP 在è¿�输层使用 TCP,并且需è¦�建立两个并行的 TCP 连接:控制连接和数æ�®è¿žæŽ¥ã€‚控制连接在整个会è¯�期间一直ä¿�æŒ�打开,而数æ�®è¿žæŽ¥åœ¨æ•°æ�®ä¼ é€�完毕之å�Žå°±å…³é—­ã€‚控制连接使用端å�£å�· 21,数æ�®è¿žæŽ¥ä½¿ç”¨ç«¯å�£å�· 20。 ![](https://github.com/CyC2018/InterviewNotes/blob/master/pics/58633775-8584-4a01-ad3f-eee4d9a466e1.jpg) -## Ô¶³ÌÖÕ¶ËЭÒé TELNET +## 远程终端å��è®® TELNET -TELNET ÓÃÓڵǼµ½Ô¶³ÌÖ÷»úÉÏ£¬²¢ÇÒÔ¶³ÌÖ÷»úÉϵÄÊä³öÒ²»á·µ»Ø¡£ +TELNET 用于登录到远程主机上,并且远程主机上的输出也会返回。 -TELNET ¿ÉÒÔÊÊÓ¦Ðí¶à¼ÆËã»úºÍ²Ù×÷ϵͳµÄ²îÒ죬ÀýÈ粻ͬ²Ù×÷ϵͳϵͳµÄ»»Ðзû¶¨Òå¡£ +TELNET å�¯ä»¥é€‚应许多计算机和æ“�作系统的差异,例如ä¸�å�Œæ“�作系统系统的æ�¢è¡Œç¬¦å®šä¹‰ã€‚ -## ÍòÎ¬Íø WWW +## 万维网 WWW [HTTP](https://github.com/CyC2018/InterviewNotes/blob/master/notes/HTTP.md) -## µç×ÓÓʼþЭÒé +## 电å­�邮件å��è®® -Ò»¸öµç×ÓÓʼþϵͳÓÉÈý²¿·Ö×é³É£ºÓû§´úÀí¡¢Óʼþ·þÎñÆ÷ÒÔ¼°Óʼþ·¢ËÍЭÒéºÍ¶ÁȡЭÒé¡£ÆäÖз¢ËÍЭÒé³£Óà SMTP£¬¶ÁȡЭÒé³£Óà POP3 ºÍ IMAP¡£ +一个电å­�邮件系统由三部分组æˆ�:用户代ç�†ã€�邮件æœ�务器以å�Šé‚®ä»¶å�‘é€�å��议和读å�–å��议。其中å�‘é€�å��议常用 SMTP,读å�–å��议常用 POP3 å’Œ IMAP。 ![](https://github.com/CyC2018/InterviewNotes/blob/master/pics/de1e46d2-748f-4da3-a29e-7de7bc840366.jpg) ### POP3 -POP3 µÄÌØµãÊÇÖ»ÒªÓû§´Ó·þÎñÆ÷É϶ÁÈ¡ÁËÓʼþ£¬¾Í°Ñ¸ÃÓʼþɾ³ý¡£ +POP3 的特点是å�ªè¦�用户从æœ�务器上读å�–了邮件,就把该邮件删除。 ### IMAP -IMAP ЭÒéÖпͻ§¶ËºÍ·þÎñÆ÷ÉϵÄÓʼþ±£³Öͬ²½£¬Èç¹û²»È¥ÊÖ¶¯É¾³ýÓʼþ£¬ÄÇô·þÎñÆ÷ÉϵÄÓʼþÒ²²»»á±»É¾³ý¡£IMAP ÕâÖÖ×ö·¨¿ÉÒÔÈÃÓû§ËæÊ±ËæµØÈ¥·ÃÎÊ·þÎñÆ÷ÉϵÄÓʼþ¡£IMAP ЭÒéÒ²Ö§³Ö´´½¨×Ô¶¨ÒåµÄÎļþ¼Ð¡£ +IMAP å��议中客户端和æœ�务器上的邮件ä¿�æŒ�å�Œæ­¥ï¼Œå¦‚æžœä¸�去手动删除邮件,那么æœ�务器上的邮件也ä¸�会被删除。IMAP è¿™ç§�å�𿳕å�¯ä»¥è®©ç”¨æˆ·éš�æ—¶éš�地去访问æœ�务器上的邮件。IMAP å��议也支æŒ�创建自定义的文件夹。 ### SMTP -SMTP Ö»ÄÜ·¢ËÍ ASCII Â룬¶ø»¥ÁªÍøÓʼþÀ©³ä MIME ¿ÉÒÔ·¢ËͶþ½øÖÆÎļþ¡£MIME ²¢Ã»Óи͝»òÕßÈ¡´ú SMTP£¬¶øÊÇÔö¼ÓÓʼþÖ÷ÌâµÄ½á¹¹£¬¶¨ÒåÁË·Ç ASCII ÂëµÄ±àÂë¹æÔò¡£ +SMTP å�ªèƒ½å�‘é€� ASCII ç �,而互è�”网邮件扩充 MIME å�¯ä»¥å�‘é€�二进制文件。MIME 并没有改动或者å�–代 SMTP,而是增加邮件主题的结构,定义了é�ž ASCII ç �的编ç �规则。 ![](https://github.com/CyC2018/InterviewNotes/blob/master/pics/ed5522bb-3a60-481c-8654-43e7195a48fe.png) -## ¶¯Ì¬Ö÷»úÅäÖÃЭÒé DHCP +## 动æ€�主机é…�ç½®å��è®® DHCP -DHCP ÌṩÁ˼´²å¼´ÓõÄÁ¬Íø·½Ê½£¬Óû§²»ÔÙÐèҪȥÊÖ¶¯ÅäÖà IP µØÖ·µÈÐÅÏ¢¡£ +DHCP æ��供了å�³æ�’å�³ç”¨çš„连网方å¼�,用户ä¸�å†�需è¦�去手动é…�ç½® IP 地å�€ç­‰ä¿¡æ�¯ã€‚ -DHCP ÅäÖõÄÄÚÈݲ»½öÊÇ IP µØÖ·£¬»¹°üÀ¨×ÓÍøÑÚÂ롢ĬÈÏ·ÓÉÆ÷ IP µØÖ·¡¢ÓòÃû·þÎñÆ÷µÄ IP µØÖ·¡£ +DHCP é…�置的内容ä¸�仅是 IP 地å�€ï¼Œè¿˜åŒ…括å­�网掩ç �ã€�默认路由器 IP 地å�€ã€�域å��æœ�务器的 IP 地å�€ã€‚ -¹¤×÷·½Ê½ÈçÏ£ºÐèÒª IP µØÖ·µÄÖ÷»ú¹ã²¥·¢ËÍ DHCP ·¢ÏÖ±¨ÎÄ£¨½«Ä¿µÄµØÖ·ÖÃΪȫ 1£¬¼´ 255.255.255.255:67£¬Ô´µØÖ·ÉèÖÃΪȫ 0£¬¼´ 0.0.0.0:68£©£¬DHCP ·þÎñÆ÷ÊÕµ½·¢ÏÖ±¨ÎÄÖ®ºó£¬ÔòÔÚ IP µØÖ·³ØÖÐȡһ¸öµØÖ·£¬·¢ËÍ DHCP Ìṩ±¨Îĸø¸ÃÖ÷»ú¡£ +工作方å¼�如下:需è¦� IP 地å�€çš„主机广播å�‘é€� DHCP å�‘现报文(将目的地å�€ç½®ä¸ºå…¨ 1,å�³ 255.255.255.255:67,æº�地å�€è®¾ç½®ä¸ºå…¨ 0,å�³ 0.0.0.0:68),DHCP æœ�务器收到å�‘现报文之å�Žï¼Œåˆ™åœ¨ IP 地å�€æ± ä¸­å�–一个地å�€ï¼Œå�‘é€� DHCP æ��供报文给该主机。 -## µã¶Ôµã´«Êä P2P +## 点对点传输 P2P -°Ñij¸öÎļþ·Ö·¢µÄËùÓжԵȼ¯ºÏ³ÆÎªÒ»¸öºéÁ÷¡£ÎļþµÄÊý¾Ýµ¥Ôª³ÆÎªÎļþ¿é£¬ËüµÄ´óСÊǹ̶¨µÄ¡£Ò»¸öеĶԵȷ½¼ÓÈëij¸öºéÁ÷£¬Ò»¿ªÊ¼²¢Ã»ÓÐÎļþ¿é£¬µ«ÊÇÄܹ»´ÓÆäËü¶ÔµÈ·½ÖÐÖð½¥µØÏÂÔØµ½Ò»Ð©Îļþ¿é£¬Óë´Ëͬʱ£¬ËüҲΪ±ðµÄ¶ÔµÈ·½ÉÏ´«Ò»Ð©Îļþ¿é¡£ +把æŸ�个文件分å�‘的所有对等集å�ˆç§°ä¸ºä¸€ä¸ªæ´ªæµ�。文件的数æ�®å�•元称为文件å�—,它的大å°�是固定的。一个新的对等方加入æŸ�个洪æµ�,一开始并没有文件å�—,但是能够从其它对等方中é€�æ¸�地下载到一些文件å�—,与此å�Œæ—¶ï¼Œå®ƒä¹Ÿä¸ºåˆ«çš„对等方上传一些文件å�—。 -ÿ¸öºéÁ÷¶¼ÓÐÒ»¸ö»ù´¡ÉèÊ©£¬³ÆÎª×·×ÙÆ÷¡£µ±Ò»¸ö¶ÔµÈ·½¼ÓÈëºéÁ÷ʱ£¬±ØÐëÏò×·×ÙÆ÷µÇ¼Ç£¬²¢ÖÜÆÚÐÔµØÍ¨Öª×·×ÙÆ÷ËüÈÔÔÚºéÁ÷ÖС£¿ÉÒÔÔÚÈκÎʱ¼ä¼ÓÈëºÍÍ˳öij¸öºéÁ÷¡£ +æ¯�个洪æµ�都有一个基础设施,称为追踪器。当一个对等方加入洪æµ�时,必须å�‘追踪器登记,并周期性地通知追踪器它ä»�在洪æµ�中。å�¯ä»¥åœ¨ä»»ä½•时间加入和退出æŸ�个洪æµ�。 -Ò»¸öеĶԵȷ½¼ÓÈëºéÁ÷ʱ£¬×·×ÙÆ÷»áËæ»ú´ÓºéÁ÷ÖÐÑ¡ÔñÈô¸É¸ö¶ÔµÈ·½£¬²¢ÈÃжԵȷ½ÓëÕâЩ¶ÔµÈ·½½¨Á¢Á¬½Ó£¬°ÑÕâЩ¶ÔµÈ·½³ÆÎªÏàÁڶԵȷ½¡£½ÓÊպͷ¢ËÍÎļþ¿é¶¼ÊÇÔÚÏàÁڶԵȷ½ÖнøÐС£ +一个新的对等方加入洪æµ�时,追踪器会éš�机从洪æµ�中选择若干个对等方,并让新对等方与这些对等方建立连接,把这些对等方称为相邻对等方。接收和å�‘é€�文件å�—都是在相邻对等方中进行。 -µ±Ò»¸ö¶ÔµÈ·½ÐèÒªºÜ¶àÎļþ¿éʱ£¬Í¨¹ýʹÓÃ×îÏ¡ÓÐÓÅÏȵIJßÂÔÀ´È¡µÃÎļþ¿é£¬Ò²¾ÍÊÇÒ»¸öÎļþ¿éÔÚÏàÁڶԵȷ½Öи±±¾×îÉÙ£¬ÄÇô¾ÍÓÅÏÈÇëÇóÕâ¸öÎļþ¿é¡£ +当一个对等方需è¦�很多文件å�—时,通过使用最稀有优先的策略æ�¥å�–得文件å�—,也就是一个文件å�—在相邻对等方中副本最少,那么就优先请求这个文件å�—。 -µ±ºÜ¶à¶ÔµÈ·½Ïòͬһ¸ö¶ÔµÈ·½ÇëÇóÎļþ¿éʱ£¬¸Ã¶ÔµÈ·½ÓÅÏÈÑ¡ÔñÒÔ×î¸ßËÙÂÊÏòÆä·¢ËÍÎļþ¿éµÄ¶ÔµÈ·½¡£ +当很多对等方å�‘å�Œä¸€ä¸ªå¯¹ç­‰æ–¹è¯·æ±‚文件å�—时,该对等方优先选择以最高速率å�‘å…¶å�‘é€�文件å�—的对等方。 -P2P ÊÇÒ»¸ö·Ö²¼Ê½ÏµÍ³£¬ÈκÎʱºò¶¼ÓжԵȷ½¼ÓÈë»òÕßÍ˳ö¡£Ê¹Ó÷ֲ¼Ê½É¢Áбí DHT£¬¿ÉÒÔ²éÕÒºéÁ÷ÖеÄ×ÊÔ´ºÍ IP µØÖ·Ó³Éä¡£ +P2P 是一个分布å¼�系统,任何时候都有对等方加入或者退出。使用分布å¼�散列表 DHT,å�¯ä»¥æŸ¥æ‰¾æ´ªæµ�中的资æº�å’Œ IP 地å�€æ˜ å°„。 -## Web Ò³ÃæÇëÇó¹ý³Ì +## Web 页é�¢è¯·æ±‚过程 -1. Ïò DNS ·þÎñÆ÷·¢ËÍ DNS ²éѯ±¨ÎÄÀ´½âÎöÓòÃû¡£ +1. å�‘ DNS æœ�务器å�‘é€� DNS 查询报文æ�¥è§£æž�域å��。 -2. ¿ªÊ¼½øÐÐ HTTP »á»°£¬ÐèÒªÏȽ¨Á¢ TCP Á¬½Ó¡£ +2. 开始进行 HTTP 会è¯�,需è¦�先建立 TCP 连接。 -3. ÔÚÔËÊä²ãµÄ´«Êä¹ý³ÌÖУ¬HTTP ±¨Îı»·â×°½ø TCP ÖС£HTTP ÇëÇó±¨ÎÄʹÓö˿ںŠ80£¬ÒòΪ·þÎñÆ÷¼àÌýµÄÊÇ 80 ¶Ë¿Ú¡£Á¬½Ó½¨Á¢Ö®ºó£¬·þÎñÆ÷»áËæ»ú·ÖÅäÒ»¸ö¶Ë¿ÚºÅ¸øÌض¨µÄ¿Í»§¶Ë£¬Ö®ºóµÄ TCP ´«Êä¶¼ÊÇÓÃÕâ¸ö·ÖÅäµÄ¶Ë¿ÚºÅ¡£ +3. 在è¿�输层的传输过程中,HTTP 报文被å°�装进 TCP 中。HTTP 请求报文使用端å�£å�· 80,因为æœ�务器监å�¬çš„æ˜¯ 80 端å�£ã€‚连接建立之å�Žï¼Œæœ�务器会éš�机分é…�一个端å�£å�·ç»™ç‰¹å®šçš„客户端,之å�Žçš„ TCP 传输都是用这个分é…�的端å�£å�·ã€‚ -4. ÔÚÍøÂç²ãµÄ´«Êä¹ý³ÌÖУ¬TCP ±¨ÎĶλᱻ·â×°½ø IP ·Ö×éÖУ¬IP ·Ö×é¾­¹ý·ÓÉÑ¡Ôñ£¬×îºóµ½´ïÄ¿µÄµØ¡£ +4. 在网络层的传输过程中,TCP 报文段会被å°�装进 IP 分组中,IP 分组ç»�过路由选择,最å�Žåˆ°è¾¾ç›®çš„地。 -5. ÔÚÁ´Â·²ã£¬IP ·Ö×é»á±»·â×°½ø MAC Ö¡ÖУ¬IP µØÖ·½âÎö³É MAC µØÖ·ÐèҪʹÓà ARP¡£ +5. 在链路层,IP 分组会被å°�装进 MAC 帧中,IP 地å�€è§£æž�æˆ� MAC 地å�€éœ€è¦�使用 ARP。 -6. ¿Í»§¶Ë·¢ËÍ HTTP ÇëÇó±¨ÎÄ£¬ÇëÇó»ñÈ¡Ò³Ãæ¡£ +6. 客户端å�‘é€� HTTP 请求报文,请求获å�–页é�¢ã€‚ -7. ·þÎñÆ÷·¢ËÍ HTTP ÏàÓ¦±¨ÎÄ£¬¿Í»§¶Ë´Ó¶ø»ñÈ¡¸ÃÒ³Ãæ¡£ +7. æœ�务器å�‘é€� HTTP 相应报文,客户端从而获å�–该页é�¢ã€‚ -8. ä¯ÀÀÆ÷µÃµ½Ò³ÃæÄÚÈÝÖ®ºó£¬½âÎö²¢äÖȾ£¬ÏòÓû§Õ¹Ê¾Ò³Ãæ¡£ +8. æµ�览器得到页é�¢å†…容之å�Žï¼Œè§£æž�并渲染,å�‘用户展示页é�¢ã€‚ -## ³£ÓÃ¶Ë¿Ú +## 常用端å�£ -| Ó¦ÓòãЭÒé | ¶Ë¿ÚºÅ | ÔËÊä²ãЭÒé | +| 应用层å��è®® | 端å�£å�· | è¿�输层å��è®® | | -- | -- | -- | | DNS | 53 | UDP | -| FTP | ¿ØÖÆÁ¬½Ó 21£¬Êý¾ÝÁ¬½Ó 20 | TCP | +| FTP | 控制连接 21,数æ�®è¿žæŽ¥ 20 | TCP | | TELNET | 23 | TCP | | DHCP | 67 68 | UDP | | HTTP | 80 | TCP | @@ -836,7 +921,7 @@ P2P | POP3 | 110 | TCP | | IMAP | 143 | TCP | -# ²Î¿¼×ÊÁÏ +# å�‚考资料 -- ¼ÆËã»úÍøÂç µÚÆß°æ -- ×Ô¶¥ÏòϼÆËã»úÍøÂç +- 计算机网络 第七版 +- 计算机网络——自顶å�‘下方法 From 1465b2dc9baf203170ce37ac3099024d10d55857 Mon Sep 17 00:00:00 2001 From: Xie Boyu Date: Tue, 27 Feb 2018 17:52:27 +0800 Subject: [PATCH 3/5] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index dadf9ed1..9a845e0b 100644 --- a/README.md +++ b/README.md @@ -18,7 +18,7 @@ # 网络 -> [计算机网络](https://github.com/CyC2018/InnterviewNotes/blob/master/notes/计算机网络.md) +> [计算机网络](https://github.com/xbhoneybee/InnterviewNotes/blob/master/notes/计算机网络.md) æ•´ç�†è‡ªã€Šè®¡ç®—机网络 第七版》,é‡�点内容会在标题之å�ŽåŠ  \*。 From 39473556ddc0db4b4531b2fa7a77fee67e30a49c Mon Sep 17 00:00:00 2001 From: Xie Boyu Date: Tue, 27 Feb 2018 18:01:18 +0800 Subject: [PATCH 4/5] =?UTF-8?q?Update=20=E8=AE=A1=E7=AE=97=E6=9C=BA?= =?UTF-8?q?=E7=BD=91=E7=BB=9C.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- notes/计算机网络.md | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/notes/计算机网络.md b/notes/计算机网络.md index 144661e2..20c9761d 100644 --- a/notes/计算机网络.md +++ b/notes/计算机网络.md @@ -360,10 +360,10 @@ CSMA/CD 表示载波监å�¬å¤šç‚¹æŽ¥å…¥ / 碰撞检测。 ![](https://github.com/CyC2018/InterviewNotes/blob/master/pics/40c3f8e5-3a20-45b6-a60c-77b9b952e104.jpg) ## 路由器交æ�¢æœºå’Œé›†çº¿å™¨çš„对比 -|集线器|路由器|交æ�¢æœº ------------------|------|----- -traffic isolation |No|Yes|Yes -å�³æ�’å�³ç”¨|Yes|No|Yes +\ |集线器|路由器|交æ�¢æœº| +|--|-----------------|------|-----| +|traffic isolation |No|Yes|Yes| +|å�³æ�’å�³ç”¨|Yes|No|Yes| 路由器æ��供防ç�«å¢™ä¿�护针对广播风暴,交æ�¢æœºä¸�é™�制 ## MAC 层 @@ -487,6 +487,7 @@ ipv4 32ä½�. ipv6 128ä½�:分割。 8组4ä½�16进制数 MAC 48ä½� + 网络层实现主机之间的通信,而链路层实现具体æ¯�段链路之间的通信。因此在通信过程中,IP æ•°æ�®æŠ¥çš„æº�地å�€å’Œç›®çš„地å�€å§‹ç»ˆä¸�å�˜ï¼Œè€Œ MAC 地å�€éš�ç�€é“¾è·¯çš„æ”¹å�˜è€Œæ”¹å�˜ã€‚ ![](https://github.com/CyC2018/InterviewNotes/blob/master/pics/86b71296-0d1e-4a63-bcd9-54955b6b781b.jpg) @@ -736,6 +737,7 @@ GBN 采用累积ACK 选择é‡�ä¼  窗å�£é•¿åº¦å¿…é¡»å°�于等于åº�å�·ç©ºé—´å¤§å°�的一å�Š + **TCP采用的ä¸�是GBN也ä¸�是SR,而是一ç§�更优的方案** ## TCP å�¯é� ä¼ è¾“ From c8080b73be6f8cbc4d1637be246c50ee74745268 Mon Sep 17 00:00:00 2001 From: Xie Boyu Date: Tue, 27 Feb 2018 18:05:43 +0800 Subject: [PATCH 5/5] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 9a845e0b..dadf9ed1 100644 --- a/README.md +++ b/README.md @@ -18,7 +18,7 @@ # 网络 -> [计算机网络](https://github.com/xbhoneybee/InnterviewNotes/blob/master/notes/计算机网络.md) +> [计算机网络](https://github.com/CyC2018/InnterviewNotes/blob/master/notes/计算机网络.md) æ•´ç�†è‡ªã€Šè®¡ç®—机网络 第七版》,é‡�点内容会在标题之å�ŽåŠ  \*。