网络知识点
体系结构
OSI分层 (7层):物理层、数据链路层、网络层、传输层、会话层、表示层、应用层。
TCP/IP分层(4层):网络接口层、 网际层、运输层、 应用层。
五层协议 (5层):物理层、数据链路层、网络层、运输层、 应用层。
每一层的协议如下:
物理层:RJ45、CLOCK、IEEE802.3 (中继器,集线器)
数据链路:PPP、FR、HDLC、VLAN、MAC (网桥,交换机)
网络层:IP、ICMP、ARP、RARP、OSPF、IPX、RIP、IGRP、 (路由器)
传输层:TCP、UDP、SPX
会话层:NFS、SQL、NETBIOS、RPC
表示层:JPEG、MPEG、ASII
应用层:FTP、DNS、Telnet、SMTP、HTTP、WWW、NFS
每一层的作用如下:
物理层:通过媒介传输比特,确定机械及电气规范(比特Bit)
数据链路层:将比特组装成帧和点到点的传递(帧Frame)
网络层:负责数据包从源到宿的传递和网际互连(包PackeT)
传输层:提供端到端的可靠报文传递和错误恢复(段Segment)
会话层:建立、管理和终止会话(会话协议数据单元SPDU)
表示层:对数据进行翻译、加密和压缩(表示协议数据单元PPDU)
应用层:允许访问OSI环境的手段(应用协议数据单元APDU)
各种协议
:ICMP协议: 因特网控制报文协议。它是TCP/IP协议族的一个子协议,用于在IP主机、路由器之间传递控制消息。
TFTP协议: 是TCP/IP协议族中的一个用来在客户机与服务器之间进行简单文件传输的协议,提供不复杂、开销不大的文件传输服务。
HTTP协议: 超文本传输协议,是一个属于应用层的面向对象的协议,由于其简捷、快速的方式,适用于分布式超媒体信息系统。
NAT协议:网络地址转换属接入广域网(WAN)技术,是一种将私有(保留)地址转化为合法IP地址的转换技术,
DHCP协议:动态主机配置协议,是一种让系统得以连接到网络上,并获取所需要的配置参数手段,使用UDP协议工作。具体用途:给内部网络或网络服务供应商自动分配IP地址,给用户或者内部网络管理员作为对所有计算机作中央管理的手段。
IP地址
IP地址的三种分类方式
http://blog.csdn.net/nineteen_/article/details/50131981
IP地址是给因特网上的每一个主机或者是路由器的每一个接口(注意是接口,而不是主机或者是路由器本身)分配的一个在全世界范围中唯一的32位的标识符。IP地址是由ICANN(Internet Corporation for Assigned Names and Numbers)机构进行分配的。
IP地址现在有三种编址方法:
(1)分类的IP地址
(2)子网的划分
(3)构成超网
下面将依次介绍这三种编址方式:
1、分类的IP地址:
顾名思义,分类的IP地址就是将IP地址划分为了2个固定长度的字段组成,第一个字段是网络号(net-id),代表所连接到的网络。第二个字段是主机号(host-id),代表了主机或者是路由器。在这种编址方式中将IP地址划分了5类,A、B、C、D、E这五类,其中A、B、C三类地址中网络号依次占了8、16、24位,并且在网络号的最开始设置了类别位,分别为0、10、110。前三类都是用于单播的,D类地址(类别位是1110)用于多播,E类地址(类别位是1111)保留下来,为以后使用。
为了提高可读性,常常将32位地址中每隔8位就加上一个点,这叫做点分十进制记法(dotted decimal notation)。也就是我们常在自己电脑上看见的那种形式。
A类地址:以0开头, 第一个字节范围:1~127(1.0.0.0 - 127.255.255.255);
B类地址:以10开头, 第一个字节范围:128~191(128.0.0.0 - 191.255.255.255);
C类地址:以110开头, 第一个字节范围:192~223(192.0.0.0 - 223.255.255.255);
D类地址:以1110开头,第一个字节范围:224~239(224.0.0.0 - 239.255.255.255);(作为多播使用)
E类地址:保留
其中A、B、C是基本类,D、E类作为多播和保留使用。
以下是留用的内部私有地址:
A类 10.0.0.0--10.255.255.255
B类 172.16.0.0--172.31.255.255
C类 192.168.0.0--192.168.255.255
IP地址与子网掩码相与得到网络号:
ip : 192.168.2.110
&
Submask : 255.255.255.0
----------------------------
网络号 :192.168.2 .0
注:
主机号,全为0的是网络号(例如:192.168.2.0),主机号全为1的为广播地址(192.168.2.255)
2、子网的划分(subnetting)
对于第一种编址方法,我们可以通过分析得出他的一些缺点:
(1)由于第一种方法将IP地址(单播)分为了三类,而每一类的数量又是固定的,所以就造成了很多机构单位去申请的时候不知道应该选用哪种,例如,申请一个B类地址,利用的连1%都不到,但是如果换为C类地址的话,又考虑到以后可能会扩展,怕地址数量不够。
(2)给每一网络都分配一个网络号,会使得路由表变得很大,这样不仅仅降低了效率,也增加了路由器的成本。
(3)如果某些单位希望立即开通一个网络进行使用,按照第一种编址方法是不能实现的,因为要获取到一个IP地址,必须去ICNAA申请。
为了解决上面叙述的问题,这时候就推出了划分子网的编址方式(也有说法叫子网寻址,子网路由选择),划分子网是给每个单位机构,自己内部的事情,在因特网中是看不见的,因为这个单位机构对因特网仍然表现为一个整体的网络。
在划分子网的编址方法中,IP地址变成了三部分组成(原来只有两个部分,网络号和主机号),网络号,子网号,主机号。子网号是从原来的主机号借来的。
这里还需要了解子网掩码的使用,原因是:IP数据报的首部不能看出源主机或者目的主机所连接的网络是否进行了子网的划分。那么怎么去使用子网掩码呢,子网掩码使用二进制表示的话,网络号和子网号的每一个位上都是1,主机号上的每一个位都是0。然后将三级的IP地址与子网掩码进行逐位的“与”操作,的出来的IP地址就是子网的网络地址。现在因特网的标准规定,对于所有的网络都必须使用子网掩码,同时在路由表中也应该有子网掩码这一栏。
3、构成超网
了解了子网划分的编址方法后,这里还存在这几个问题:
(1)整个IPv4上的地址空间最终将被耗尽(2011年2月3日,IANA就宣布了IPv4地址已经耗尽)
(2)因特网的主干网上的路由表中的项目增加很快
为了解决这两个问题,又有一种编址方式出现了,无分类域间路由选择CIDR(Classless Inter-Domain Routing)。这种新的编址方式将IP地址又从三级地址变成了两级地址,同时,CIDR消除了传统的A、B、C类地址和子网划分的概念,原因是让IPv4的地址更加高效地被分配。取而代之的是,网络前缀(network-prefix)和主机地址,以及“斜线记法”(slash
notation),或者是CIDR记法。即在IP地址后面加上斜线/,然后写上网络前缀的位数。
CIDR不使用子网划分只是说不再像以前那样指明哪几个字段是子网字段,但是由于现在仍然有网络在使用子网划分和子网掩码,所以CIDR也使用了32位的地址掩码,同样的,地址掩码也是由1和0组成的,1的个数就是网络前缀的长度。也可以称地址掩码为子网掩码。
使用CIDR来记录IP地址,由于CIDR记法能够表示网络前缀的位数,就产生了CIDR地址块,一个地址块中有很多的地址,在路由器中就利用CIDR地址块来查找目的网络。这种地址的聚合称为路由聚合(route aggregation)或者是构成超网(supernetting)。
由于编址方法变化了,那么在路由器中的项目也应该作相应的改变。现在,每个项目由“网络前缀”和“下一级跳转的地址”组成。当路由器查找路由表的时候发现了不止一条结果,这时候就采用最长前缀匹配(longest-prifix matching)。因为网络前缀越长,地址块中的地址就越少,也就是越具体。
ARP地址解析协议
1:首先,每个主机都会在自己的ARP缓冲区中建立一个ARP列表,以表示IP地址和MAC地址之间的对应关系。
2:当源主机要发送数据时,首先检查ARP列表中是否有对应IP地址的目的主机的MAC地址,如果有,则直接发送数据,如果没有,就向本网段的所有主机发送ARP数据包,该数据包包括的内容有:源主机 IP地址,源主机MAC地址,目的主机的IP 地址。
3:当本网络的所有主机收到该ARP数据包时,首先检查数据包中的IP地址是否是自己的IP地址,如果不是,则忽略该数据包,如果是,则首先从数据包中取出源主机的IP和MAC地址写入到ARP列表中,如果已经存在,则覆盖,然后将自己的MAC地址写入ARP响应包中,告诉源主机自己是它想要找的MAC地址。
4:源主机收到ARP响应包后。将目的主机的IP和MAC地址写入ARP列表,并利用此信息发送数据。如果源主机一直没有收到ARP响应数据包,表示ARP查询失败。
广播发送ARP请求,单播发送ARP响应。
RARP协议
RARP是逆地址解析协议,作用是完成硬件地址到IP地址的映射,主要用于无盘工作站,因为给无盘工作站配置的IP地址不能保存。工作流程:在网络中配置一台RARP服务器,里面保存着IP地址和MAC地址的映射关系,当无盘工作站启动后,就封装一个RARP数据包,里面有其MAC地址,然后广播到网络上去,当服务器收到请求包后,就查找对应的MAC地址的IP地址装入响应报文中发回给请求者。因为需要广播请求报文,因此RARP只能用于具有广播能力的网络。
TCP
TCP状态迁移
TCP连接的11种状态
一条TCP连接在其生存期内会经历一系列状态。TCP连接包含11个状态。分别是:LISTEN、SYN_SENT、SYN_RECEIVED、ESTABLISHED、FIN_WAIT_1、FIN_WAIT_2、CLOSE_WAIT、CLOSING、LAST_ACK、TIME_WAIT以及最终状态CLOSED。状态转换图如下所示:
TCP状态迁移图
简单分析下状态含义以及转换的过程:
CLOSED :是一个虚拟的状态,它代表一条连接结束时的状态。
LISTEN :表示服务端正在等待来自TCP客户端的连接请求。服务端为此要调用bind()以及listen()函数。
SYN_SENT : 客户端发起连接,发送SYN给服务端后,进入此状态。
SYN_RECEIVED : 服务端接收到客户端的SYN请求,服务端由LISTEN状态进入SYN_RECEIVED状态,同时发送一个ACK和一个SYN给客户端。另一种情况 是客户端发送SYN的同时接收到服务器的SYN请求,客户端就会由SYN_SENT状态进入SYN_RECEIVED状态。
ESTABLISHED : 表示经过三次握手,连接已经建立,可以在两个方向上传输数据。这是一条连接在数据传输阶段的常见状态。
FIN_WAIT_1 : 主动关闭的一方发送FIN,由ESTABLISHED状态进入FIN_WAIT_1状态。
FIN_WAIT_2 : 主动关闭的一方,接收到对方的FIN ACK,由FIN_WAIT_1 状态,进入FIN_WAIT_2 状态。
CLOSE_WAIT : 被动关闭的一方,在接收到FIN后,由ESTABLISHED状态进入此状态。
CLOSING : 这种状态表示此时双方刚好可能都在关闭连接,即客户端向服务器发送FIN报文,进入FIN_WAIT_1状态后,没有收到服务器发来的ACK报文,反而受到服务器发来的FIN报文,说明此时客户端和服务器同时发起关闭连接,随后,客户端进入CLOSING状态。
LAST_ACK : 被动关闭的一方,发起关闭请求,由CLOSE_WAIT状态,进入此状态。在接收到ACK后,会进入CLOSED状态。
TIME_WAIT : 有3个状态可以转化为TIME_WAIT状态。
由FIN_WAIT_2进入此状态:在双方不同时发起FIN的情况下,主动关闭的一方在完成自身发起的关闭请求后,接收到被动关闭一方的FIN后进入的状态。
由CLOSING状态进入:双方同时发起关闭,都做了发起FIN的请求,同时接收到了FIN并做了ACK的情况下,由CLOSING状态进入。
由FIN_WAIT_1状态进入:同时接受到FIN(对方发起),ACK(本身发起的FIN回应),与2的区别在于本身发起的FIN回应的ACK先于对方的FIN请求到达,而2是FIN先到达。这种情况概率最小。
CLOSED : 在超时或者连接关闭时候进入此状态。
关闭连接的三种方式
在结束一条连接的时候任一方都需要独立地关闭属于自己的一般连接。因此,TCP的一端可能通过下列三种状态迁移方式,将连接从ESTABLISHED状态,转换到CLOSED状态。
一端先关闭:
ESTABLISHED -> FIN_WAIT_1 -> FIN_WAIT_2 -> TIME_WAIT -> CLOSED
另一端先关闭:
ESTABLISHED -> CLOSED_WAIT -> LAST_ACK -> CLOSED
两端同时关闭:
ESTABLISHED -> FIN_WAIT_1 -> CLOSING -> TIME_WAIT -> CLOSED
TIME_WAIT状态分析
为什么关闭连接后,不直接进入CLOSED状态,而是先进入TIME_WAIT状态,再进入CLOSED状态呢?
当连接出于TIME_WAIT 状态时,要等待2MSL的时间,才能迁移到CLOSED状态。
一种情况,因为TCP连接的本地端,需要发送一个ACK报文以确认另一端的FIN报文,然而它并不确定这个ACK报文是否已成功交付。另一端,如果没有收到ACK报文,就会重传FIN报文。在这种情况下,TIME_WAIT状态的作用就是等待,以在有需要时重传ACK。
假设目前连接的通信双方都已经调用了close(),双方同时进入CLOSED的终结状态,而没有走TIME_WAIT状态。会出现如下问题,现在有一个新的连接被建立起来,使用的IP地址与端口与先前的完全相同,后建立的连接是原先连接的一个完全复用。还假定原先的连接中有数据报残存于网络之中,这样新的连接收到的数据报中有可能是先前连接的数据报。为了防止这一点,TCP不允许新连接复用TIME_WAIT状态下的socket。处于TIME_WAIT状态的socket在等待两倍的MSL时间以后,将会转变为CLOSED状态。这就意味着,一个成功建立的连接,必然使得先前网络中残余的数据报都丢失了。
MSL就是maximum segment lifetime(最大分节生命期),这是一个IP数据包能在互联网上生存的最长时间,超过这个时间IP数据包将在网络中消失 。MSL在RFC 1122上建议是2分钟,而源自berkeley的TCP实现传统上使用30秒。
TCP三次握手和四次挥手
三次握手:
第一次握手:客户端发送syn包(syn=x)到服务器,并进入SYN_SEND状态,等待服务器确认;
第二次握手:服务器收到syn包,必须确认客户的SYN(ack=x+1),同时自己也发送一个SYN包(syn=y),即SYN+ACK包,此时服务器进入SYN_RECV状态;
第三次握手:客户端收到服务器的SYN+ACK包,向服务器发送确认包ACK(ack=y+1),此包发送完毕,客户端和服务器进入ESTABLISHED状态,完成三次握手。
握手过程中传送的包里不包含数据,三次握手完毕后,客户端与服务器才正式开始传送数据。理想状态下,TCP连接一旦建立,在通信双方中的任何一方主动关闭连接之前,TCP 连接都将被一直保持下去。
四次挥手
与建立连接的“三次握手”类似,断开一个TCP连接则需要“四次握手”。
第一次挥手:主动关闭方发送一个FIN,用来关闭主动方到被动关闭方的数据传送,也就是主动关闭方告诉被动关闭方:我已经不 会再给你发数据了(当然,在fin包之前发送出去的数据,如果没有收到对应的ack确认报文,主动关闭方依然会重发这些数据),但是,此时主动关闭方还可 以接受数据。
第二次挥手:被动关闭方收到FIN包后,发送一个ACK给对方,确认序号为收到序号+1(与SYN相同,一个FIN占用一个序号)。
第三次挥手:被动关闭方发送一个FIN,用来关闭被动关闭方到主动关闭方的数据传送,也就是告诉主动关闭方,我的数据也发送完了,不会再给你发数据了。
第四次挥手:主动关闭方收到FIN后,发送一个ACK给被动关闭方,确认序号为收到序号+1,至此,完成四次挥手。
理解tcp重传
https://toutiao.io/posts/mkdapk
一分钟理解TCP重传
原创 2017-12-14 fireflyc 写程序的康德
为什么需要重传
任何信息在介质中传输可能丢失,这是由于传输介质的物理特性决定的,所以网络不可能被设计为“可靠的”(不是由于考虑“性能”原因而是压根做不到)。既然物理层无法提供可靠数据传输那么只能由协议提供可靠传输了,其中最有名的协议就是TCP了。
TCP是基于IP的网络协议,它提供可靠、有序的数据传输。在数据传输之前客户端和服务器端通过三次握手建立连接,建立连接的就是双方交换Seq(数据包序号)、MSS(每个TCP数据包大小) 、Win(滑动窗口,一次可以确认多少个TCP数据包),连接建立完成后每个TCP数据包都要被ACK(确认)。简单来说TCP通过确认/重传机制实现了“数据包可靠传输”。
重传原理
TCP数据包头部包含了两个字段——Seq表示数据包序号,ACK表示确认序号。下面演示了三次握手过程中Seq和ACK的变化过程。
客户端随机取一个值x作为Seq发送到服务器端;服务器端回复一个TCP数据包,头部包含Seq(随机值y),ACK=x+1。注意这里有一个常见的误区,ack确认的是当前数据包的“下一个”数据包,ack其实可以作为“期望得到的下一个seq”。客户端收到服务器端回复之后单独回复一个ack=y+1,就完成TCP的握手了。
后续数据包传递都会延续seq和ack的值,如果发送端某个数据包丢失了那么接收端不会发送ack(其实是duplicate ack),发送端在等待一段时间后发现没有ack,于是主动重发数据包。发送端的等待的时间叫RTO(Retransmission TimeOut)。
RTO的选择很重要,如果太大那么网络带宽利用率会特别低,发送端要过很久才知道要重传而此时要重传的数据是在太多严重浪费带宽资源。如果太小在高延时的网络高带宽(恩,你访问国外网站就属于这种网络)中也会浪费带宽资源。于是就有了Fast Retransmit机制,简单来说当发送端发现来自接收端的多个重复ACK(duplicate ack)的时候就不再等待RTO而是直接选择重发。
总结一下:经典TCP重发是发送端主动重发的,当数据包经历了一段时间后还没有被接收端确认此时发送端主动重发数据包。Fast Retransmit是由接收端主动要求重发的,当接收端收到了“不想要”的数据包时会重复ACK“上一个”数据包从而触发发送端的重发。这两种重发策略一般是同时使用,它们是互补的。
举个例子:发送端有D1(1-10)、D2(11-20)、D3(21-30)、D4(31-40)四个数据包要发送,每个数据包10bytes用括号内的数字表示。
乱序的情况:接收端收到D1,发送ack=11(D2的序号)。如果在发送过程中D4在D1之后达由于D4携带的seq=31所以接收端会丢弃这个数据包然后再次发送ack=11。此时发送端会收到两个ack(duplicate ack)如果开启了Fast Retransmit特性那么发送端立即从D2开始重新发送。
丢包的情况:接收端收到D1,发送ack=11(D2的序号)。如果在发送过程中D2丢失那么后续到达的包是D3,由于D3携带的seq=21所以接收端会丢弃这个数据包然后再次发送ack=11。此时发送端也会出现duplicate ack从而触发重传。
如果接收端的ACK数据包丢失了或者网络时延太高那么也会触发重传。因为发送端对每个数据包都设置了一个RTO,如果到时间没有收到ACK它会“主动”重发数据包。
Q&A
Q:多线程对一个Socket写入是否会触发TCP重发?程序上是否要考虑“乱序”?
A:首先要搞清楚一点,我们往Socket写入的数据是“应用层数据包”而不是TCP数据包。TCP/IP协议栈会把应用层数据包划分出多个TCP数据包发送出去,每次write都会生成N个连续的TCP数据包。所以即便我们多线程往Socket写入也不会出现TCP数据包的乱序(应用层数据包可能是乱序的)。
Q:重传和拥塞控制有什么关系?
A:TCP拥塞控制是指尽可能的利用带宽,它围绕4个核心概念展开:慢启动、拥塞避免和快速重传、快速恢复。其中快速重传、快速恢复属于TCP重传机制,慢启动是指对滑动窗口的控制,拥塞避免好重传机制有一定关系,如果存在大量重传那么网络上可能出现了拥塞(拥塞避免的关键是识别拥塞)。
Q:怎么看“替代TCP”的说法?
A:TCP最遭人诟病的就是它的重传机制不可控。如果网络延时比较高或者质量比较差有一定丢包(特别是移动网络),TCP的重传机制触发“不及时”这就导致应用体验很差。比如一个1000帧的视频丢了第100帧那么后续的900帧都要重传(即便已经收到了)。当然这只是一个例子,视频还是可以做一定“弥补”的),如果是手机游戏(比如王者荣耀、荒野行动)情况就没有这么乐观了。为了尽可能的让“重传”可控于是诞生了各种“替代TCP”的自制协议(大部分是基于UDP),比如Google的QUIC、kcp。我个人对这方面研究不多,总体而言它们牺牲了TCP的一些“通用特性”来换取一定的“灵活性”,所以并不是惊天地泣鬼神的“替代TCP”。
Q:怎么看TCP单边加速
A:TCP单边加速是指针对通讯的某一端做性能加速,市面上有很多这种产品。但是个人觉得这些都是骗人的,并没有一种算法适合所有网络情况。要根据不同的网络情况配置不同的拥塞控制算法。比如“国际链路”属于高延时高带宽,配置了Google的BBR算法“梯子”的速度至少能提高70-80%(你懂得)。
TCP窗口对传输速率的影响
https://mp.weixin.qq.com/s/LX9S3A3i_7hDz39i-DYOBQ
路由协议
题目集锦
ip相关
1.IP地址编址方法正确发展次序:ABC分类地址-->子网划分-->无分类编址CIDR
补充知识点:CIDR(无分类域间路由选择)
CIDR最主要有两个以下特点:
- 消除传统的A,B,C地址和划分子网的概念,更有效的分配IPv4的地址空间,CIDR使IP地址又回到无分类的两级编码。记法:IP地址::={<<网络前缀>,<<主机号>}。CIDR还使用“斜线记法”即在IP地址后面加上“/”然后写网络前缀所占的位数。
- CIDR把网络前缀都相同的连续IP地址组成一个“CIDR地址块”,即强化路由聚合(构成超网)。
地址掩码:是一连串的1和0组成,而1的个数救赎网络前缀长度。在斜线记法中。斜线后面的数字就是地址掩码中1的个数。
构成超网:将网络前缀缩短,网络前缀越短,其地址块所包含的地址数就越多。
CIDR的好处:
- 路由聚合有利于减少路由之间的路由选择信息交换,从而提升了整个因特网性能。
- 使用CIDR另一个好处就是可以更有效地分配IPV4的地址空间。
在使用CIDR中,在查找路由表时可能会得到不止一个匹配结果,这时应当从匹配结构中选择具有最长网络前缀的路由,因为网络前缀越长,其地址块就越小,因而路由就越具体。
使用CIDR后查找最长前缀匹配,应使用二叉线索,即将无分类编址的路由表放在一层次的数据结构中,自上而下的按层次查找。操作时应先找出每一个IP地址的唯一前缀,唯一前缀就是在表中所有的IP地址中,该前缀是唯一的
CIDR支持路由归纳,可以将多个地址块聚合在一起,将路由表中的许多路由条目合并为更小的数目,这样减少路由器中路由表的大小,减少路由通告的时间。
2.下列关于210.120.1.128/10的地址块正确的是: 网络号为210.64.0.0/10 广播地址是210.127.255.255 最大IP是210.127.255.254 一共有2^22-2个ip地址
3.网络体系结构可以定义成
建立和使用通信硬件和软件的一套规则和规范
4.关于传统的分类IP编址方法,正确的说法是
A类、B类、C类地址都是单传播地址,它们的网络号字段分别是1,2,和3字节长,而在网络号字段的最前面有1~3位的类别位,其数值分为规定为0,10,110。
A类地址的网络号字段占一个字节,只有7位可供使用,但可指派的网络号是126个。 128-2 全0 全1都不要
D类地址(前4位是1110)用于多播,而E类地址(前4位为1111)保留为以后用。
5.以下关于网络体系结构的描述中
- 网络体系结构是抽象的,而实现是具体的
- 层次结构的各层之间相对独立
- 网络体系结构对实现所规定功能的硬件和软件有没有明确的定义
- 当任何一层发生变化时,只要接口保持不变,其他各层均不受影响
6.网络协议主要要素为
语法、语义、同步
7.与10.110.12.29 mask 255.255.255.224 属于同一网段的主机IP 地址是
10.110.12.30