如果你家里要上网,电信运营商(ISP)的师傅会在你家安装一直光猫,而在远方的另一端的电信服务器上也接了一只光猫,光猫的作用就是电信号和光信号之间的相互转换。信号的远程传输走的是光信号(光缆),到你家之后经过光猫变成电信号,另一端也是如此。光猫一边插在光缆上,另外一边接的是根网线。网线里是8根双绞线,从网线出来时已经是电信号了,光猫于是通过这跟网线连上你家的路由器。路由器就可以为你家开启各种服务,所有的无线设备都可以通过无线路由连上无线信号进行上网了。路由器还会接出网口。网口可以接有线信号。连接主机后,主机就能上网了。
使用流量的情况:比如手机里的电话卡。手机就能通过流量信号和基站进行沟通。基站大多是4G基站,按蜂窝状部署,覆盖道路和城市。基站也就相当于一个局域网,会为每一台设备临时分配一个ip地址。
NAT网关会对内外ip进行管理。
如果恰巧你在极地,那里没有基站(破坏生态,还很难维护)。那就只能通过卫星通讯,走卫星信号了。(例如,电影里间谍用卫星通讯,别人无法监听)
有一次一家外贸公司网断了,请运营商师傅看了一下,结果信号到光猫那里都是没问题的。那就是公司内部网络的问题,跟运营商没关系了,于是师傅拍拍屁股走人。留下公司的人蒙圈不已,之后找了个会修网络的人来看了看,发现路由器两端的ip地址被设成一样的了。于是改成不一样后,网络恢复正常了。但还有几台电脑不能上网,过去看了看,发现电脑获取ip地址被写死了,于是改成自动获取ip地址,就可以了。
还有一次在一家金融公司,设计网络的人一开始没设计好,
家庭路由器会有内网网口(LAN)和外网网口(WAN),把外网网口的线插到光猫(Modem)拉出的网线的网口上。将这个外网网口配置成和光猫的局域网一样。内网网口连上家里的所有电脑。
路由器将多个局域网相连,每个局域网的出口就叫网关。
如果不是同一网段的想要通信,就需要把数据包法网默认网关(Gateway)网关的地址一定是和源IP地址是一个网段的,往往不是第一个,就是第二个。发给网关的方法就跟发给同网段的其他机器是一样的。
任何一个想发往其他局域网的包,都会到达其中一个网关,被拿进来,拿下MAC头和IP头,看看,根据自己的路由算法,选择另一个网口,加上IP头和MAC头,然后扔出去。
路由器中都会有一张静态路由表,就是在路由器上,配置一条一条规则。
每当要选则从哪个网口抛出去的时候,就一条一条地匹配规则,找到符合的规则,就按规则中设置地那样,从某个口抛出去。
查看自己的出口IP地址
当你在云主机上ping你的电脑的IP的时候显示是通的,但是小鲨鱼(wireshark)并没有抓到包。这是怎么一回事呢?
说明电信运营商帮你收到了这个包,但是并没有把这个包给放进来。(这样做也有好处,防止黑客入侵)除非你内网穿透。
桥接模式:直接搭在了你的一张网卡上。和你的电脑是平级的。
NAT模式:把我的主机当成虚拟机的外网。主机IP相当于变成虚拟机的公网IP,会通过NAT映射,映射到虚拟机的子网IP。
NAT设置可以设置:虚拟机的子网IP、子网网关、端口转发(把发到主机上的数据转发给虚拟机)。
当网络环境复杂并且多变的时候,如果总是用静态路由,手工修改路由实在太复杂了。因而需要动态路由算法。
每个路由器都保存一个路由表,包含多行,每行对应网络中得一个路由器,每行包含两部分信息,一个是到目标路由器,要从哪出去;另一个是到目标路由器的距离。由此看出,每个路由器都是知道全局信息的。
每过几秒,每个路由器都将自己所知的到达所有的路由器的距离告知邻居,每个路由器也能从邻居那里得到相似的信息。每个路由根据邻居的信息,计算和其他路由器的距离,并更新最短路。
但这种算法有一个缺陷:1. 好消息传得块,坏消息传得慢。
比如原本有两个人A和B他们之间距离为1,这时新来了一个C距离B为1:
那么B和C很快就能更新到C得距离。
而一旦C消失了,B就找不到C了,但是A“以为”它能找到,在距离它为2的位置。B一听,那么我应该距离C三的位置。A一听坏了,你是3那我不就变成4了。。。。。如此循环往复,一直到超过了某一阈值,他们才真的确定C消失了。
2. 每次发送的时候,要发送整张全局路由表,网络大了谁也受不了。(早期路由协议RIP就是这种算法)
当一个路由器启动的时候,第一步是发现邻居,向邻居say hello 。然后邻居都回复它。于是路由开始计算和邻居的距离,发送一个echo 要求马上返回,除以二就是距离
然后将自己和邻居之间的链路状态包广播出去,发送到整个网络的每个路由器。这样每个路由器都能接收到它和它邻居之间的关系的信息。因而,每个路由器都能在自己本地构建一个完整的图,然后针对这个图使用dikstra算法,找到两点之间的最短路径。链路状态路由只广播更新的或改变的网络拓扑,这使得更新信息更小,节省了带宽和CPU利用率。而且一旦一个路由器挂了,它的邻居都会广播这个消息,可以使得坏消息迅速收敛。
广泛应用在数据中心中的协议。由于主要用在数据中心内部,用于路由决策,因而称为内部网关协议(Interior Gateway protocol简称IGP),内部网关协议的重点就是找到最短的路径。在一个组织内部,路径最短往往最优。当然有时候OSPF可以发现多个最短的路径,可以在这多个路径中进行负载均衡(数据量很大)。这常常被称为等价路由。
基于路径矢量路由协议。是他的升级版。是自治系统间的路由协议,BGP交换的网络可达性信息提供了足够的信息来检测路由回路并根据性能优先和策略约束对路由进行决策。
UDP段格式:源端口号、目的端口号、UDP长度、UDP校验和、数据。
端口号的范围是0-2^16-1,其中0-1023被很多软件固定占用。(well-known,比如你每次去人民广场都会有肯德基、麦当劳等店占据。)
很多服务有well-known的端口号,然后客户端程序的端口号却不必是well-known的,往往是每次运行客户端程序时由系统自动分配一个空闲的端口号,用完就释放掉。称为ephemeral端口号。
UDP协议不面向连接,也不保证传输的可靠性。
1. 发送端的UDP协议层只管把应用层传来的数据封装成段交给IP协议层就算完成任务了,如果因为网络故障该段无法发到对方,UDP协议层也不会给应用层返回任何错误信息。
2. 接收端的UDP协议层只管把收到的数据根据端口号交给相应的应用程序就算完成任务了,如果发送端发来多个数据包并且在网络上经过不同的路由,到达接收端时顺序已经错乱了,UDP协议层也不保证按发送时的顺序交给应用层。
3. 通常接收端的UDP协议层将收到的数据放在一个固定大小的缓冲区中等待应用层来提取和处理,如果应用程序提取和处理的速度很慢,而发送端发送的速度很快,就会丢失数据包,UDP协议层并不报告这种错误。
1. 需要资源少,在网络情况较好的内网,或者对于丢包不敏感的应用。
2. 不需要一对一沟通建立连接,而是可以广播的应用
3. 需要处理速度快,时延低,可以容忍少数丢包,但是要求即便网络拥塞也毫不退缩,一往无前。
TCP段格式:源端口号(16位)、目的端口号(16位)、序号(32位)、确认序号(32位)、首部长度(4位)、保留(6位)、窗口大小(16位)、校验和(16位)、紧急指针(16位)、选项、数据。
顺序问题:、丢包问题:给包编号。每一个包都有一个ID,在建立连接地时候,会商定其实id是什么,然后按照id一个一个发送。为了保证不丢包,对于发送地包都要进行应答,但是这个应答也不是一个一个来,而是回应大某个之前地id,表示都收到了,这种模式称为累计确认或累计应答:
发货人仓库:发送已确认、发送未确认、未发送可发送、未发送不可发送(看对方仓库大小)
接收人仓库:接收已确认、等待接收未确认、不能接收比如发送方未收到ACK,或者无应答,会超时重试,时间必须大于往返时间RTT,否则会引起不必要地重传,当然也不宜过大,访问速度会变慢。
估计往返时间,需要TCP通过采样RTT的时间,然后进行加权平均,算出一个值,而且这个值还是要不断变化的,因为网络状况不断地变化。除了采样RTT,还要采样RTT的波动范围,计算出一个估计地超时时间。由于重传时间是不断变化的,我们成为自适应重传算法。
如果再次超时,需要重传,TCP会将超时间隔加倍。两次超时,说明网络环境差,不易频繁发送。
快速重传的机制:当接收方收到序号大于下一个所期望的报文段时,就会检测到数据流中的一个间隔,于是向对方发送冗余的ACK,而当客户端收到三个冗余的ACK后,就会在定时器过期之前,重传丢失的报文段。
SACK:在TCP头里加SACK的东西,将缓存的地图发送给对方
连接维护:状态位(SYN:发起连接;ACK:回复;RST:从新连接;FIN:结束连接。TCP是面向连接的,因而双方要维护来连接的状态,这些带状态位的包发送,会引起双方的状态变更。)
TCP流量控制:双方都维护一个窗口大小。
发送方会定时发送窗口探测数据包,看是否有机会调整窗口的大小。当接收方比较慢的时候,要防止低能窗口综合征:当窗口太小的时候,不更新窗口,直到达到一定大小,或者缓冲区一半为空,才更新窗口。
通过拥塞窗口cwnd的大小来控制的,怕把网络塞满。网络有带宽:每秒钟能够发送多少数据;端到端有时延 ,在理想状态下,通道的容量=带宽x往返时延。如果设置大宋窗口,使得发送但未确认的包为通道的容量,就能够撑满整个管道。
如果在这基础上体哦啊大窗口,使得单位时间能发更多的包。那么从一端到另一端中间经过的设备单位时间就要处理越来越多的包。超过处理能力的包会被丢弃,这是我们不想看到的。解决办法是给这些设备加上缓存,处理不过来的在队列里排着,但缺点是会增加延时,如果延时到达一定程度,就会超时重传,也是我们不想看到的。
于是TCP拥塞控制主要避免两种现象:包丢失和超时重传。一旦出现了这些现象就说明发送速度太快了,要慢一点。但是一开始怎么知道速度多块呢?我们怎么知道窗口大小应调为多大呢?
1. 慢启动:比如通过漏斗往瓶子里灌水,一开始不能一桶水一下子倒进去,肯定会漫出来。要一开始慢慢倒,然后到后面就可以越来越快。
2. 拥塞控制:当超过某一阈值的时候就要小心点,不能发太快了,要慢下来
3. 快速恢复:当接收端丢了一个中间包,发送三次前一个包的ACK,于是发送端就会快速重传,不必等待超时再传。TCP认为这种情况不严重,因为大部分没丢,只丢了一小部分。
为什么是三次而不是两次。A通知完B,B通知完A还不够吗?
——其实B通知完A后B并不知道A能不能收到它发的消息。所以还得需要A回复一下B,让B能够相信A确实能够收到B发的消息。
在建立连接的过程中,双方都要维护一个状态机。双方的状态变化时序图就像这样。
A说分手吧,B说我知道了。(但B还没同意呢,A还要等B同意)
B说我同意,咱分手吧。A回答说好的。(B还需要收到A的消息才能确认A收到了B发的消息。如果B没有收到A发的确认消息,B会再发一遍。所以A会再等一会确认B收到了A的确认消息。过了一会两人都不再发消息了,连接就真的断了。)
还有一种异常情况就是,B最后一直没有收到ACK包,于是B还在不断地重发FIN包,这个时候A再收到包以后就表示,我已经在这里等了这么长时间,算是仁至义尽了,之后地我就都不认了,于是就直接发送RST,B就知道A早就跑了。
Lifetime,报文最大生存时间,任何保温在网络上存在的最长时间,超过将被丢弃。TCP报文是基于IP协议的,而IP头种有一个TTL域,是IP数据包可以经过的最大路由书,没经过一个处理它的路由器此值就减1,当辞职位0则数据包将被丢弃,通识发送ICMP报文通知源主机。协议规定MSL位2分钟,实际应用中常用的是30秒,1分钟和2分钟等。