这里是一只很详细的网络问题详解合集,大部分是自己通过查书籍/知乎/wiki总结的.
这里特别感谢Zhihu-车小胖同学的指导,建议对网络有疑惑的也可以看看他的专栏跟合集.这里大量参考了他的文章.如果发现理解不清的建议看原文.
然后每个问题的引用部分都是摘自搜索引擎,并非自己写的,不是人话的地方请谅解.或者给我个好的说法我修正一下.
A.TCP的拥塞避免与流量控制问题
这是两个问题.
先说拥塞控制: 主要是 1. 慢启动 2. 拥塞避免的窗口增加算法 分界线是ssthresh
1.拥塞避免
- 慢启动
还是A给B丢快递,A不知道B一次能接多少个,于是先一次丢一个.计数1号.
B回复2,代表1号快递已经收到,准备收2号
然后A开始一次仍两个,计数2,3
B回复4,代表2,3快递收到,准备收4.
A下一次继续翻倍丢4个快递.计数4,5,6,7
B回复8….以此类推
A再一次丢8个.发现B只回应了12,喊了三次12
说明B已经接不赢了,然后12号快递就没接住掉了.但是13,14,15应该是接到了,
所以A开始降速,降一半到上一次的4个一扔
if(dupacks>=3) ssthresh = max(2 , cwmd/2); //这里cwnd=8,所以ssthresh=4
//ssthresh(Slow Start Threshold 慢启动门槛) 一旦超过这个值,就进入了拥塞避免
- 快速重传
cwnd(拥塞窗口) = ssthresh + 3* SMSS =4+3 = 7
13,14,15这三个快递虽然没有明确确认收到,但是已经隐含的确认了.所以这3个快递不应该占据在空中飞的快递的数量. 在空中飞的应该是4个快递,加上达到的3个(13,14,15) .得出cwnd应该为7
- A的快速重传
1> 重传12号快递
2> 继续扔16,17,17,19号快递
- 快速重传结束信号
一旦B接到A的16号快递或之后的确认,视为快速重传完成
- 拥塞避免
A发现一次丢4个是安全的,于是选择cwnd = ssthresh = 4 为基准线,逐渐增加5,6,线性增长到极限
2.流量控制
B.如何解决IP地址不够用的问题
引用:
- NAT地址转换(NetWorkAddress Translation)网络地址转换
- 静态NAT(Static NAT)
- NAT池(Pooled NAT)
- 端口级(Port-Level NAT)
虚拟IP技术Intranet (VIP)未分配给真实的主机的IP
IPv6
十几年前就在说ipv4要分配完毕了,但是十几年后ipv6还是没有普及,原因就在于ip地址不够用的问题可以通过”合租”的办法解决.比如说一栋大楼的房子都是有限固定的,但是一间屋子可以住很多人,可以合租,可以再细分.通过这种方法,解决ipv4不足的问题.
而采用子网划分的方法,是最简单的手段之一.比如实验室有50个人,我并不需要浪费C类ip地址去给每个实验室的人都分一个单独的公网ip.假设网络中心分配了一个公网ip是210.42.xxx.77.基于这个公网ip.我们就可以借助子网掩码跟递归的原理.把一个网络划分成几个子网.分出大量的172.xx.xx.xx的ip.然后基于每一个172开头的ip.甚至我还可以再开一个无线AP,比如usb无线网卡/笔记本的无线信号.把网络再复用给其他人.这样一个ip,就能给非常多的人去使用了.
当然,这也有几个坏处.比如内网/无线网可以算作是局域网,外部的ip如果想直接跟某个内网的ip进行交互,那直接访问ip的方式是不行的,因为在其他ip看来,只有一个210.42.xxx.77的ip.进入internet之前,要被转换回去,信息包返回的时候,也要通过NAT也就是地址转换技术转回来.再就是这样划分的网络总带宽是有限的,也就像一个西瓜.可以无限切下去,但是会导致每份越来越少,最后导致速度过慢失去意义.
C. P2P软件采用技术&原理(改进的方案
peer to peer 技术.比如之前最常见的迅雷/bit彗星 p2p的优势是数据来源很多,服务器把一个文件随机分成x,y等份,然后不同用户下载不同部分,再集中起来供他人使用.”我为人人,人人为我”是p2p的一种核心思想
所以我们经常可以迅雷下资源的时候看到资源数不断的在增加,而资源数很少很老的资源下载速度就会非常慢.
缺点是来源多了之后质量不一,不稳定容易出错.所以p2p下载之后会进行文件校验,如果校验块不一致,就会重新下载.迅雷有时候常常能见到资源下载卡在99.9%的地方,这其实是还有一些校验块没有完成或是还要传输自己的数据给服务器.其实这时候如果你把它终止然后去掉文件的后缀名中td /bt的地方,会发现很多是可以打开的.就是这个原因.
引用:
什么是对等网络(P2P)技术?P2P技术术语覆盖层网络(OverlayNetwork)的范畴,是对于客户机/服务器(C/S)模式来说的一种网络信息交换方式。在C/S模式中,数据的分发采用专门的服务器,多个客户端都从 此服务器获取数据。这种模式的有点是:数据的一致性容易控制,系统也容易管理。但是此种模式的缺点是:因为服务器的个数只有一个(即便有多个也非常有限),系统容易出现单一失效点;单一服务器面对众多的客户端,由于CPU能力、内存大小、网络带宽的限制,可同时服务的客户端非常有限,可拓展性查。 P2P技术正是为了解决这些问题而提出来的一种对等网络结构。在P2P网络中,每个节点既可以从其他节点得到服务,也可以向其他节点提供服务。这样,庞大的终端资源被利用起来,一举解决了C/S模式中的两个弊端。
什么叫P2P?
P2P在IT界最初的含义是Peer-to-Peer,后来叫Pointer-to-Pointer,简单来说,P2P就是指数据的传输不再通过服务器,而是网络用户之间直接传递数据。P2P的常用实现
(1)普通的直连式P2P实现
(2)STUN方式的P2P实现几种典型的P2P网络模型:
(1)纯P2P模型;
(2)带有简单的发现服务器的P2P模型;
(3)带有发现和查找服务器的P2P模型;
(4)带有发现,查找和内容服务器的P2P模型;现有的P2P软件以及它们采用的技术和原理:
QQ:QQ之间文件的传输是通过P2P通信
迅雷:
用户首先从Web服务器上 获得下载文件的种子文件,种子文件中包含下载文件名及数据部分的哈希值,还包含一个或者多个的索引(Tracker)服务器地址。它的工作过程如下:客户 端向索引服务器发一个超文本传输协议(HTTP)的GET请求,并把它自己的私有信息和下载文件的哈希值放在GET的参数中;索引服务器根据请求的哈希值
查找内部的数据字典,随机地返回正在下载该文件的一组节点,客户端连接这些节点,下载需要的文件片段。因此可以将索引服务器的文件下载过程简单地分成两个 部分:与索引服务器通信的HTTP,与其他客户端通信并传输数据的协议,我们称为BitTorrent对等协议。BitTorrent协议也处在不断变化 中,可以通过数据报协议(UDP)和DHT的方法获得可用的传输节点信息,而不是仅仅通过原有的 HTTP,这种方法使得BitTorrent应用更加灵活酷狗:酷狗音乐是采用P2P音乐共享原理
BT
:
“BT”是BitTorrent的简称,是一种依赖P2P方式将文件在大量互联网用户之间进行共享与传输的协议。由于其实现简单, 使用方便,在中国用户之间被广泛使用。BitTorrent中的节点在共享一个文件时,首先将文件分片并将文件和分片信息保存在一个流(Torrent) 类型文件中,这种节点被形象地称作“种子”节点。其他用户在下载该文件时根据Torrent文件的信息,将文件的部分分片下载下来,然后再其他下载该文件
的节点之间共享自己已经下载的分片,互通有无,从而实现文件快速分发。由于每个节点在下载文件的同时也在为其他用户上传该文件的分片,所以整体来看,不会 随着用户数的增加而降低下载速度,反而下载的人越多,速度越块。
D. 全双工无线通信(技术,现状)
单工: 工作方向单方向 例如老电视机
半双工:说和听无法同时进行 例如:对讲机
全双工:同时进行 同时同频收发数据
E. 无线网为什么不能采用CSMA/CD. // 移动通信,卫星,红外,电视,计算机通信各采用了什么信道共享
1.CSMA/CD相关
引用:(不是人话)
CSMA/CD,带有冲突检测的载波侦听多路访问,这个协议解决了在Ethernet上的各个工作站如何在线缆上进行传输的问题,利用它检测和避免当两个或两个以上的网络设备需要进行数据传送时网络上的冲突。在802.11无线局域网协议中,冲突的检测存在一定的问题,这个问题称为”Near/Far”现象,这是由于要检测冲突,设备必须能够一边接受数据信号一边传送数据信号,而这在无线系统中是无法办到的。 鉴于这个差异,在802.11中对CSMA/CD进行了一些调整,采用了新的协议CSMA/CA(Carrier Sense Multiple Access with Collision Avoidance)或者DCF(Distributed Coordination Function)。
CSMA/CA利用ACK信号来避免冲突的发生,也就是说,只有当客户端收到网络上返回的ACK信号后才确认送出的数据已经正确到达目的。
CSMA/CA协议的工作流程是:一个工作站希望在无线网络中传送数据,如果没有探测到网络中正在传送数据,则附加等待一段时间,再随机选择一个时间片继续探测,如果无线网路中仍旧没有活动的话,就将数据发送出去。接受端的工作站如果受到发送端送出的完整的数据则回发一个ACK数据报,如果这个ACK数据报被接收端收到,则这个数据发送过程完成,如果发送端没有收到ACK数据报,则或者发送的数据没有被完整地收到,或者ACK信号的发送失败,不管是那种现象发生,数据报都在发送端等待一段时间后被重传。 CSMA/CA通过这种方式来提供无线的共享访问,这种显式的ACK机制在处理无线问题时非常有效。然而不管是对于802.11还是802.3来说,这种方式都增加了额外的负担,所以802.11网络和类似的Ethernet网比较总是在性能上稍逊一筹。
CSMA/CD和CSMA/CA的主要差别对比如下:CSMA/CD:带有冲突检测的载波侦听多路访问,发送包的同时可以检测到信道上有无冲突;CSMA/CA:带有冲突避免的载波侦听多路访问,发送包的同时不能检测到信道上有无冲突,只能尽量‘避免’;
两者的传输介质不同,CSMA/CD用于总线以太,而CSMA/CA则用于无线局域网802.11b;
检测方式不同,CSMA/CD通过电缆中电压的变化来检测,当数据发生碰撞时,电缆中的电压就会随着发生变化;而CSMA/CA采用能量检测(ED)、载波检测(CS)和能量载波混合检测三种检测信道空闲的方式;
WLAN中,对某个节点来说,其刚刚发出的信号强度要远高于来自其他节点的信号强度,也就是说它自己的信号会把其他的信号给覆盖掉;
本节点处有冲突并不意味着在接收节点处就有冲突;
综上,在WLAN中实现CSMA/CD是比较困难的。
2.通讯相关的计算机网络
引用:
信道共享技术:
①静态分配:时分复用(TDMA)、频分复用(FDMA)、码分复用(CDMA)
②动态分配:受控多点接入:轮听轮询:集中式控制
传递轮询:分散式控制
随机多点接入:ALOHA、CSMA(载波监听多点接入)、CSMA/CD(带冲突)
普通市话:基站
移动通讯(1G,2G,3G)码分;第一代 模拟蜂窝,频分多址技术
第二代 数字通信,时分多址码分多址
第三代 宽带通信
第四代 无线多媒体
小灵通:时分
卫星通讯:频分复用 时分多址
红外通讯:点对点 广播(红外通信)
有线电视:频分多路复用 FDM
计算机网络:随机接入 受控接入 信道复用
CSMA/CD:载波监听多点接入/冲突检测
F. TCP的可靠传输如何实现
这个问题实际是说数据包是如何在网络中准确的传输. 三次握手只是简单的表述
那深入来说 –> 可以对这个问题进行几个层面的分析 : 1. 不丢失/重复 2.不被修改.
1. tcp怎么保证数据传输过程中不被丢失&修改
首先,TCP设计主要是针对数据丢失,比如传输过程中受到了干扰.错了几位数据,丢了几个包的情况.这种tcp能比较好的应对,这是第一种**”可靠”**. 这种可靠基于以下的因素
- 16位的checkSum(校验和) 判断数据是否损坏
- 定时器(判断是否超时重传)
- 报文标号(检测丢失分组跟多余的数据,保证有序)
- 确认(双方互相确认接受否)
- 滑动收发窗口(增加信道的吞吐量)
但是,很多时候网络中数据传输都是明文在流动,tcp的机制本身并不能避免数据被窃取/篡改.各种第三方设备都可能截获你的数据包查看内容或者伪造. TCP自身的cheksum机制其实非常脆弱,而且很透明,狸猫换太子是很容易实现的.这方面来说. 从安全的角度来说,它**”并不可靠”**. (注意这两个角度完全不一样)
为什么很多人现在喜欢提出一个说法,认为TCP/UDP之上应用层之间应该加一个SSL/TLS加密层.就是因为现在网络的传输不丢失特性已经基本没什么问题了,主要可靠性的体现开始往数据内容的可靠上偏向.
最常见的办法自然就是加密. 还有一个身份验证,而SSL/TLS就是比较成熟通用的方案之一,所以现在各大浏览器都开始大力推广HTTPS的普及.(HTTPS = HTTP + 加密 + 认证 +完整性保护)
2. tcp的可靠性到底坚固么?
TCP的安全可靠性其实非常脆弱.
因为中间人可以伪造重新计算checksum.提交给应用层,如果应用层不能纠错,就很容易被欺骗,从而失去了可靠性.
从TCP的历史来说,最早的TCP/IP是美国局域网中,在能确定数据链路的安全可控的前提下(避免第三方破坏篡改),加上TCP自身的传输确认机制,我们称TCP是一种可靠的传输机制.
而现实的开放互联网中,一次数据包的传输,可能要经过很多的路由设备,谁都能在中间进行篡改.就像快递.任何一个分发站都能把快递的起始地,收件地进行篡改.checksum就像快递的盒大小,快递重量.伪造方可以经过精心调整计算凑成一样的值.
那么TCP后面也提出了解决的办法.比如option 19 (MD5 Hash) 跟 option 29 (SHA hash).两者都是加密认证选项,前者md5已经有人可以成功破解,SHA生成的哈希目前还没有先例. 就好比快递每一层传输过程中我都会携带一个照片或者加密值,只要谁在中间修改了目的地,或者换包了,那么就会被发现.因为加密的原文是无法推导的.
基于目前的`TCP option 29之后,才能说TCP是一种可靠的传输层协议.
引用:一、可靠传输的要求
可靠的传输应该满足下面两个要求:
(1)传输的信道不产生差错;
(2)保证传输数据的正确性,无差错、不丢失、不重复、并且按序到达。
这里有两层意思,一是能够正确地传输数据,二是接收方能够及时处理发送方发送的数据。
二、可靠传输的工作原理
TCP为了提供可靠传输:
(1)首先,采用三次握手来建立TCP连接,四次握手来释放TCP连接,从而保证建立的传输信道是可靠的。
(2)其次,TCP采用了连续ARQ协议(回退N,Go-back-N;超时自动重传)来保证数据传输的正确性,使用滑动窗口协议来保证接方能够及时处理所接收到的数据,进行流量控制。
(3)最后,TCP使用慢开始、拥塞避免、快重传和快恢复来进行拥塞控制,避免网络拥塞。
三、可靠传输的方式
(1)应用数据被分割成TCP认为的最合适发送的数据块;
(2)当TCP发出一个报文段后,就启动一个定时器,用来等待目的端确认收到这个报文段;若没能及时收到这个确认,TCP发送端将重新发送这个报文段(超时重传);
(3)TCP收到一个发自TCP连接的另一端的数据后就将发送一个确认,不过这个确认不是立即就发送,而是要推迟几分之一秒后才发送;
(4)TCP将保持它的首部和数据的检验和;(这是一个端到端的检验和,为了检验数据在传输过程中发生的错误;若检测到段的检验和有差错,TCP将丢弃和不确认收到此报文段并希望发端可以进行超时重传)
(5)由于TCP报文段是作为IP数据报来传输的,又因为IP数据报的到达可能会失序,所以TCP报文段的到达也可能会失序;因此,有必要的话TCP会对收到的数据进行重新排序后交给应用层;
(6)因为TCP报文段是作为IP数据报来传输的,并且IP数据报可能会发生重复,所以TCP的接收端必须丢弃掉重复的数据;
(7)TCP提供流量控制;(因为TCP连接的每一方都有固定大小的缓冲空间,TCP的接收端只允许另一端发送接收端缓冲区所能接纳的数据,这一限制可以防止较快主机致使较慢主机的缓冲区溢出)
G. RTP,OSPF,BGP三要素分析三个路由协议.如何实现
引用:
1.和谁交换信息(广播,洪泛)?
2.交换什么信息(只与移交范围内的节点)?
3.什么时候交换(周期性,事件驱动)?
(和哪些路由器交换信息?交换什么信息?在什么时候交换信息?)RIP协议
(Routing Information Protocol)路由信息协议,内部网关协议的一种。每经过一个路由器,跳数就加1,RIP认为好的路由就是它通过的路由器的数目少,即“距离短”。它与OSPF都是分布式路由选择协议。他是距离向量协议
(1)仅与相邻路由器交换信息。如果两个路由器之间的通信不需要经过另一个路由器,那么这两个路由器就是相邻。RIP协议规定,不相邻的路由器不交换信息。
(2)路由器交换的信息是当前本路由器所知道的全部信息,即自己的路由表。也就是说,交换的信息是:“我是本自治系统中所有网络的(最短)距离,以及每个网络应经过的下一跳路由器”。
(3)按固定的时间间隔交换路由信息,例如,每隔30秒。然后路由器根据收到的路由信息更新路由表。当网络拓扑发生变化时,路由器也及时向相邻路由器通告拓扑变化的路由信息。
OSPF协议
(Open Shortest Path First)开放最短路径优先。OSPF只是一个协议的名字,并不表示其他的路由选择协议不是“最短路径优先”。实际上,所有的在自治系统内部使用的路由 选择协议(包括RIP协议)都是要寻找一条最短的路径。最主要特征是使用分布式的链路状态协议(linkstate protocol),而不是像RIP那样的距离向量协议。
(1) 向本自治系统中所有路由器发送消息。这里使用的方法是洪泛法(flooding),这就是路由器通过所有输出端向所有相邻的路由器发送信息。而每一个相邻路由器又再将此信息发往其所有的相邻的路由器(但不再发送给刚刚发来信息的那个路由器)。这样,最终整个区域中所有的路由器都得到了这个消息的一个副本。
(2)发送的信息就是与本路由器相邻的所有路由器的链路状态,但这只是路由器所知道的部分信息。所谓“链路状态”就是说明本路由器都和哪些路由器相邻,以及该链路的“度量”(metric)。对于RIP协议,发送的消息是:“到所有网络的距离和下一跳路由器”。
(3)只有当链路状态发生变化时,路由器才向所有路由器用洪泛发送此信息,而不像RIP那样,不管网络拓扑有无发生变化时,路由器之间都要定期交换路由表的信息。
BGP协议
边界网关协议BGP
边界网关协议BGP只能是力求寻找一条能够到达目的网络且比较好的路由,而并非要寻找一条最佳路由。BGP采用了路径向量路由选择协议,它与距离向量协议(如RIP)和链路状态协议(如OSPF)都有大的的区别
自己的部分:
RIP封装格式:L2 Header + ip + udp +rip 如果按照封装格式划分 rip应该在应用层.(然并否,应在网际层
RIP是干嘛的:rip是一种路由协议,用于路由器之间交换路由表(路由表用来转发ip包). 所以rip最终目的是用来交换路由表来转发ip包.
(1)RIP
(2)OSPF
(3)BGP:一个更像应用程序的路由协议
BGP全称边界网关路由协议.用于AS(Autonomous System自治系统)之间交换路由信息,我们称之为外部BGPeBGP;也可以用于AS内部路由器同步路由信息,称之为内部BGP(iBGP)
BGP在tcp的179端口运作,与其说是路由协议,不如说是一个app—-一个用来互相分发路由信息的app.
E.g. :
两台电脑A & B直连并在一个网段,他们之间通信不需要路由协议.因为是直通的.
如果他们不是直连,也不在一个网段,通信手段就可以用静态的路由(指定的路径),或者路由协议使A B二者如何互相访问,这样A跟B就可以正常通信
把上面的A&B两台电脑换成路由器,A路由与B路由通信是BGP. 就是一样的道理,
H. 网络安全的重大事件,案例影响
I. 计算机通信中,可靠性交付应由谁来负责(网络?端系统)
引用:
在计算机网络领域,网络层应该向运输层提供怎样的服务(“面向连接”还是“无连接”)曾引起了长期的争论。争论焦点的实质就是:在计算机通信中,可靠交付应当由谁来负责?是网络还是端系统(即是网络层还是运输层)?
方案一:让网络负责可靠交付(借鉴电信网的成功经验)
面向连接的通信方式,建立虚电路(VirtualCircuit), 以保证双方通信所需的一切网络资源。如果再使用可靠传输的网络协议,就可使所发送的分组无差错按序到达终点。但虚电路表示这只是一条逻辑上的连接,分组都沿着这条逻辑连接按照存储转发方式传送,而并不是真正建立了一条物理连接。请注意,电路交换的电话通信是先建立了一条真正的连接。因此分组交换的虚连接和电路交换的连接只是类似,但并不完全一样。方案二:网络层不提供服务质量的承诺。
即所传送的分组可能出错、丢失、重复和失序(不按序到达终点),当然也不保证分组传送的时限。网络层向上只提供简单灵活的、无连接的、尽最大努力交付的数据报服务。网络在发送分组时不需要先建立连接。每一个分组(即IP数据报)独立发送,与其前后的分组无关(不进行编号)。方案一与方案二的比较:
因特网采用方案二的原因:
由于传输网络不提供端到端的可靠传输服务,这就 使网络中的路由器可以做得比较简单,而且价格低廉(与电信网的交换机相比较)。如果主机(即端系统)中的进程之间的通信需要是可靠的,那么就由网络的主机
中的运输层负责(包括差错处理、流量控制等)。采用这种设计思路的好处是:网络的造价大大降低,运行方式灵活,能够适应多种应用。因特网能够发展到今日的 规模,充分证明了当初采用这种设计思路的正确性。
J. TCP/UDP的面相连接与无连接关系
简单来说.tcp用于可靠性要求高的地方,必须由双方同时合作运转. UDP只是注重速度跟成本.
先说面相连接的TCP :
- 好比两个人A,B合作捡收快递并登记,一个只负责丢快件,一个只负责接收.那么连接建立的时候,就是
- A对B说你那边好了么
- B说准备好了
- A就开始准备丢快件给他.告诉他一共20个快件
- 丢第一个快件,B答一声收到一个.丢第二个快件,B答已收两个. 这就是传输数据过程
- 如果其中A给B丢了一个快件,B超过一定时间没有应答,那么A认为可能丢偏了地方,于是就会重新扔一个.这就是超时重传
- 如果Advertised window size = 0 :代表A连续丢了好几个快递,这时候B手忙脚乱.就会说A你丢慢点,忙不过来了.
- 如果Advertised window size > 0 : 代表A丢的很慢或者没有丢了,B就跟他说继续丢吧,我这没事了
- 一直这样反复,直到20个快件都传递完,也就是一定大小的数据包传输完成后.准备结束
- A说已经丢了20个了,完事了
- B说OK, 那我先走了
- A说 好的
这就是一次完整的**面相连接的TCP数据包传输.**并且TCP是一个虚拟连接 (非实时的对讲机也是一种类似的例子,一边说了话之后另一边接收,并回执已收到的信息.)
虚拟连接: 跟物理连接(链路,灯光,信号…)相对,物理连接是实在看得见摸得到的. 虚拟连接是不存在的,看不见摸不着.只能通过这种双向的消息模拟物理连接传输数据. 而且因为双方确认机制的存在.确保了TCP连接的准确性.
再说无连接的UDP
无连接的UDP传输方式比较好理解.就是上面的快递员A一次往B那丢20个快件.而不需要B应答,然后这20个到底有几个丢到了正确的位置,B能收到几个A并不知道.但是这个效率就会高很多. 适用于很多不要求高准确性,但是需要快速反应跟低成本的地方.
然后以上都是历史也就是设定初期的设定,现在随着各方优化,UDP逐渐开始在很多地方取代TCP了.比如
- 网页浏览
- 代理服务器.
- 视频直播/流媒体
- 实时游戏
- 物联网
未来二者的展望
理论上TCP的确比UDP复杂很多,也看起来安全很多,但是为什么反而UDP提升改进要比TCP大很多,就是因为TCP因为设计的冗余跟复杂的拥塞控制算法 来 确保最高的网络通信的可靠性这个并非是大部分网络通讯都需要的.
当今用户更在意网络 “卡不卡” ,视频的时候流程不. 所以基于复杂的多次握手挥手协议的TCP协议栈反而极难改进.
加上UDP有一个得天独厚的优势就是打洞省去不少服务器资源开销.在改进上,已经有很多厂商包括Google,LinNode开始用UDP加上一些加密跟确认机制来伪装成TCP这样可靠的协议.我觉得这也很可能是未来继续发展的一个趋势.
K. 路由协议浅谈.
假设网络中的ip包,都是高速公路上的一辆辆小车. 他们如何到达目的地呢? 现实中是通过导航信息.
网络中就是通过每hop(跳)的路由变化,来达到最终的目的地
名词解释:
- AS(Autonomous System自制系统)是指在一个/多个实体管辖下的所有ip网络和路由器的全体.他们对互联网执行共同的路由策略
- RIP :最多15跳,不适合大型网络,无法设置子网掩码,无法得知路径开销.只知道哪条路最短,RIP是三种常见路由协议里面最落后的,现在基本使用的也不多.
- EIGRP : 是思科专属协议,其他品牌不能使用.OSPF是通用性相对好的.
目前常用的路由协议AD优先级:
直连路由(直达)>静态路由(自己规划路线)>eBGP(外部BGP)>EIGRP>OSPF>ISIS>RIP>iBGP(内部BGP)
路由查找
ip包达到路由器,如何查找路由表呢,怎么查效率最高? (也就是如何完成导航任务的)
L. 从port,ip,mac总结TCP/IP
位于TCP层的port. IP层的ip地址. 数据链路层的MAC地址
意思是解释 为什么网络中需要 prot,ip,mac?
1.为什么要有端口
一台服务器上不会只跑一个服务,而
引用:
以太网上封装了很多种协议
IPv4: 0x0800
ARP:0x0806
802.1q: 0x8100
PPPoE : 0x8863 0x8864
IPv6: 0x86DD等等协议,以太网卡需要这个协议号来区分是哪个栈的,网卡也只会读取以太网头14个字节,然后根据协议信息来做辨别,如果他需要读取TCP端口号的信息,那也就没有TCP/IP协议栈什么事了,网卡直接提供接口函数给应用程序,个人认为网络分层的概念,就是数据链路层做自己份内的事,网络层的事还是留给IP来做比较合理。
所以个人认为,网卡不会和应用层直接打交道,不会解释端口号信息。
IPv4 或IPv6在启动的时候,应该通过一个注册机制,以IPv4为例,告诉网卡0x0800是我IPv4的,有包来了请通知我,通过我注册时的回调函数 callback 来执行,包到达IPv4,通过IP头的协议号来分辨是哪个上层协议,和刚才的方式类似,通过回调函数到达上层,比如TCP;TCP读取端口号,这个端口号就是创建socket时注册的,socket创建成功应该有一个process ID,这应该是操作系统来完成的,TCP于是就把[ 端口号 Process ID] 联系了起来,于是就和这个Process ID进程交换,完成数据的发送和接收。
引用2:
ip能锁定一台物理机器,对应着一张网卡,外界发来的数据包网卡都会接收。但是问题来了,网卡给程序提供了接口,你监听一下我,要是有消息来了,我就转发给你。这样应用程序就能收到数据了。但是问题来了,程序A和程序B都需要监听网卡接发数据,网卡说那我把接到的数据都发给你两,你们自己看着办吧。好,小A小B都接受了。但是又来了CDEF……,不行了,每个包都被发到了所有应用程序,每个应用程序都累得不行,最终垮了。
好,那网卡说我给你们加个表示吧,我们之间可以用一个号码来作为标识,我和小A之间就用1来标识,如果外界发给1号标识的数据我就转发给你,你监听我的时候得告诉我你监听的时1,我就转发1的数据包给你。好了其他的BCD…都自己弄一个标识号,只要不重复就行。这样大家都省事了。
最后设计到安全,一个标识号只能被一个应用程序监听,因为如果小A程序和小B同时监听一个标识号号,那就坏了,我传的数据都被AB接到,这样数据安全性就没办法保证了。这个标识号就是端口,最初设计网络数据交换的设计者不知道是怎么想的。这是我的理解。
其实网卡都是被系统层封装了,端口和进程之间的关系也是系统封装好的。我们只需要用socket就行,给定一个端口号就行了。其他的事都交给操作系统去做。
2.为什么要有IP
按理说, 只要知道了接收端的MAC地址就能找到接受方主机在网络中的位置, 看起来IP地址就变成了多余的.实则不然,假设主机A向主机B发送一条消息的时候必须经过一条路由,即使发送方A知道了B的MAC地址, 但是由于A.B是在两个隔断的网络中,B仍然无法接受到A消息,此时,A就要先将数据包发送给路由器.
此外假设在不使用IP的情况下, 主机A就要将数据包进行广播, 这样就会造成数据包的多次重传(路由器A广播到路由器B, 与此同时,路由器B也在进行广播, 导致数据包在整个网络中不停地重发.)
如果我们只用 MAC 地址的话,那么路由器需要记住每个 MAC 地址所在的子网是哪一个(不然每一次收到数据包的时候路由器都要重新满世界地去找这个 MAC 地址的位置)。而世界上有2^{48}个 MAC 地址,这就意味着即使我们给每个 MAC 地址只留 1 字节的储存空间,每个路由器也需要 256 TB 的内存, 而且维护这么大的一张表, 会使得信息超过网桥的工作极限,最终无法工作.
3.为什么要有MAC
除了发送者,这个广播域里的所有主机网卡都会收到一份数据copy,因为没有MAC地址,网卡无从知道是否属于自己主机的包,因为它没有权利来读取IP信息,于是这些包会通过中断的方式来通知CPU来处理,然后告诉IP层取走数据,IP层再检查IP地址是不是自己的,是就接收,不是的就丢弃。这合理吗?显然不合理,因为所有的包都会影响所有的主机,这种网络几乎不可用,资源都被浪费了。
而有了MAC地址,交换机查询Mac转发表,知道MAC地址和端口的映射关系,只发给接收者,到达目的地网卡,检查来包的MAC和自己的MAC进行对比,对比一致才会提交给上层,这个转发过程彼此不会影响,显然要合理的多。
M. TCP/IP需要解决哪些问题,如何设计TCP/IP协议
引用:
1. 互联网到底应该采取那种方式?
网络层向上只提供简单灵活的、无连接、尽最大努力交付的数据报服务,网络在发送分组时不需要先建立连接。每一个分组(即IP数据报)独立发送,与其前后分组无关(不进行编号)。网络层不提供服务质量的承诺。即所传送的分组可能出错,丢失、重复和失序(不按序到达终点),当然也不保证分组传送的时限
2.网络层向运输层提供服务(IP层向上提供服务),提供的是面向连接的服务还是无连接的服务?
面向连接和面向无连接的实质就是:在计算机通信中,可靠交付应当由谁来负责?是网络还是端系统
面向连接:
建立虚电路VC(Virtual Circuit),需要建立连接。在 通信结束后要释放建立的虚电路。面向无连接:
计算机网络的端系统是有只能的计算机。计算机本身有很强的差错处理的能力(这点和传统的电视机有本质上的差别),因此,因特网在设计上就采用了和电信网完全不同的思路因特网采用的设计思路是这样的:网络层向上提供简单
灵活的、无连接的、尽最大努力交付的数据包服务。
对比的方面 虚电路服务 数据包服务 思路 可靠通信应当由网络来保证 可靠通信应当由用户主机来保证 连接的建立 必须有 不需要 终点地址 仅在连接建立阶段使用,每个分组使用短的虚电路号 每个分组都有终点的完整地址 分组的转发 属于同一条虚电路的分组均按照同一条路由进行转发 每个分组独立选择独立选择路由进行转发 当结点处故障时 所有通过出故障的结点的虚电路均不能工作 出故障的结点可能会丢失分组,一些路由可能会发生变化 分组的顺序 总是按发送顺序到终点 到达终点的时间,不一定按发送顺序 端到端的差错处理和流量控制 可以由网络负责,也可以由用户主机负责 有用户主机负责
- TCP/IP 主要解决 互联&共享的问题
- TCP存在的主要缺陷有:
1)性能比UDP低,包括延迟时间等。
2)TCP的crc校验位只有16位, 当出现错误时,有1/65535的概率不能够被检测出来,不够可靠。
3)TCP存在粘包的情况,就是就是我们收到的数据流,并且有可能是多个数据包合并的内容,而不是数据块,在后续处理的过程中一定要单独处理。
4)目前TCP层的设计过于陈旧,毕竟是60-70年代的东西, 很多地方不够理想。例如:单个连接只能承载一套数据流,这样导致象新浪这样的网站,打开网页要发很多TCP连接。如果在底层设计承载多套数据流就要好很多。
5)TCP的内部参数默认很多不完全适应现在高速网络的需求,当时的网络和现在不一样,例如:现在我们为了加快ip包的传递往往设置了nodelay,关闭一些过于老化的模块。
N. 5层模型/沙漏结构总结TCP/IP
所谓沙漏结构指的是: 构造层,连接层,资源层,汇集层,应用层.
O. IP地址的结构问题(改进?ipv6?) 以及IP层的协议跟功能
引用:
- IP协议
- ICMP协议
- ARP协议
- RARP协议
- IGMP协议