文章目录
1. 网络协议的体系结构
OSI参考模型、TCP/IP结构和五层协议结构

-
应用层:通过应用进程间的交互来完成特定网络应用,它定义的是应用进程间的通信和交互规则。常用的应用层协议有:域名解析协议DNS、超文本传输协议HTTP、电子邮件协议SMTP和POP3等
-
传输层:主要负责向进程间的通信提供通用的数据传输服务,该层主要协议有TCP和UDP
UDP TCP 是否连接 无连接 是否可靠 不可靠传输,不使用流量控制和拥塞控制 传输方式 支持一对一、一对多和多对多交互通信 面向对象 面向报文 信道 全双工可靠信道 首部开销 首部开销小,仅8字节 场景 适用于实时应用,如IP电话、实时视频会议、直播等 -
网络层:选择合适的网间路由和交换结点,确保计算机通信的数据及时传送
-
数据链路层:负责网络寻址、错误侦测和改错。当表头和表尾被加至数据包时,会形成了帧。四大特点:
-
封装成帧:把网络层数据报加头和尾,封装层帧,帧头中包括源MAC地址和目的MAC地址
-
透明传输:在数据链路层将网络层数据封装成帧时,会在首部和尾部分别添加SOH以及EOT这两个特殊字符,接收方根据这两个字符来确定帧的帧首和帧尾。如果上层协议发过来的数据(即链路层的数据部分)包含EOT,那么接收方解析这个帧的时候就会误以为数据已经结束,但是链路层通过对这个字符添加转义符ESC,那么当接收到连续的两个转义字符时,就删除前面的一个
-
可靠传输: 在出错率很低的链路上很少用,但是无线链路WLAN会保证可靠传输
-
差错检验(CRC):接收者检测错误,如果发现差错,丢弃该帧
-
-
物理层: 实现相邻计算机节点之间比特流的透明传送,尽可能屏蔽掉具体传输介质和物理设备的差异,使其上面的数据链路层不必考虑网络的具体传输介质是什么
另外在OSI参考模型中还有两层:
- 表示层:数据格式转化、数据加密等
- 会话层:简历、管理和维护会话
不同层工作的设备
- 传输层:四层交换机、四层的路由器
- 网络层:路由器、三层交换机
- 数据链路层:网桥、以太网交换机、网卡
- 物理层:中继器、集线器、双绞线
2. ARP原理
ARP协议根据目标ip地址借助ARP请求和ARP响应来确定目标的MAC地址 。
- 原理:通过广播发送ARP请求,ip地址一致的主机接收该请求,然后将自己的MAC地址加入的ARP响应包返回给源主机。要进行MAC地址缓存来避免占用网络流量
- 每个主机都会在自己的ARP缓冲区建立一个ARP列表,表示ip地址和MAC地址的对应关系
- 当源主机要发送数据时,首先检查ARP列表中是否有对应ip地址的目标主机的MAC地址。若有,则直接发送;若无,则向本网段的所有主机发送ARP数据包。该数据的内容有:源ip地址,源MAC地址,目标主机ip地址
- 当本网络的所有主机收到该ARP数据包时,首先检查数据包中的ip地址是否是自己的ip地址。若不是则丢弃,若是,则首先从数据包中取出源主机的ip和MAC地址写入自己的ARP列表中,若已存在,则覆盖。然后将自己的MAC地址写入ARP响应包中,告诉源主机自己的MAC地址
- 源主机收到ARP响应包后,将目标主机的iP和MAC地址写入ARP列表中。若源主机一直没有收到ARP响应,则ARP查询失败
- 广播发送ARP请求,单播发送ARP响应
3.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的三次握手过程?为什么会采用三次握手,若采用二次握手可以吗?
建立连接的过程是利用客户服务器模式,假设主机A为客户端,主机B为服务器端。
(1)TCP的三次握手过程:主机A向B发送连接请求;主机B对收到的主机A的报文段进行确认;主机A再次对主机B的确认进行确认。
(2)采用三次握手是为了防止失效的连接请求报文段突然又传送到主机B,因而产生错误。失效的连接请求报文段是指:主机A发出的连接请求没有收到主机B的确认,于是经过一段时间后,主机A又重新向主机B发送连接请求,且建立成功,顺序完成数据传输。考虑这样一种特殊情况,主机A第一次发送的连接请求并没有丢失,而是因为网络节点导致延迟达到主机B,主机B以为是主机A又发起的新连接,于是主机B同意连接,并向主机A发回确认,但是此时主机A根本不会理会,主机B就一直在等待主机A发送数据,导致主机B的资源浪费。
或者如果只握手2次,第二次握手时如果服务端发给客户端的确认报文段丢失,此时服务端已经准备好了收发数(可以理解服务端已经连接成功)据,而客户端一直没收到服务端的确认报文,所以客户端就不知道服务端是否已经准备好了(可以理解为客户端未连接成功),这种情况下客户端不会给服务端发数据,也会忽略服务端发过来的数据。

TCP对应的协议和UDP对应的协议
TCP对应的协议:
(1) FTP:定义了文件传输协议,使用21端口。
(2) Telnet:一种用于远程登陆的端口,使用23端口,用户可以以自己的身份远程连接到计算机上,可提供基于DOS模式下的通信服务。
(3) SMTP:邮件传送协议,用于发送邮件。服务器开放的是25号端口。
(4) POP3:它是和SMTP对应,POP3用于接收邮件。POP3协议所用的是110端口。
(5)HTTP:超文本传输协议,是从Web服务器传输超文本到本地浏览器的传送协议。
(6)HTTPS:HTTP的安全版本
(7)SSH:用于加密安全登陆
UDP对应的协议:
(1) DNS:用于域名解析服务,将域名地址转换为IP地址。DNS用的是53号端口。
(2) SNMP:简单网络管理协议,使用161号端口,是用来管理网络设备的。由于网络设备很多,无连接的服务就体现出 其优势。
(3) TFTP:简单文件传输协议,该协议在熟知端口69上使用UDP服务。
(4)NTP:网络时间协议,用于网络同步
(5)DHCP:动态主机配置协议,配置IP地址
NAT、DHCP、DNS的作用
-
NAT:网络地址转换(NAT,Network AddressTranslation)属接入广域网(WAN)技术,是一种将私有(保留)地址转化为合法IP地址的转换技术,它被广泛应用于各种类型Internet接入方式和各种类型的网络中。原因很简单,NAT不仅完美地解决了lP地址不足的问题,而且还能够有效地避免来自网络外部的攻击,隐藏并保护网络内部的计算机。
-
DHCP:动态主机设置协议(Dynamic Host ConfigurationProtocol, DHCP),是一个局域网的网络协议,使用UDP协议工作,主要有两个用途:给内部网络或网络服务供应商自动分配IP地址,给用户或者内部网络管理员作为对所有计算机作中央管理的手段。
-
DNS:DNS 是域名系统 (Domain Name System)的缩写,是因特网的一项核心服务,它作为可以将域名和IP地址相互映射的一个分布式数据库,能够使人更方便的访问互联网,而不用去记住能够被机器直接读取的IP数串。
HTTP和HTTPS的区别
区别 | HTTP | HTTPS |
---|---|---|
协议 | 运行在TCP之上,明文传输,客户端与服务器段都无法验证对方的身份 | 运行在SSL协议之上,SSL协议运行在TCP之上,它是添加了加密和认证机制的HTTP |
端口 | 80 | 443 |
资源消耗 | 较少 | 由于加密处理的存在,会消耗更多的CPU和内存资源 |
加密机制 | 无 | 共享密钥和公开密钥加密并用的混合加密机制 |
安全性 | 弱 | 由于加密机制,安全性强 |
区别:
-
HTTPS协议需要到CA申请证书,需要一定费用,针对HTTP不验证通信双方的身份。
-
HTTP是超文本传输协议,信息是明文传输,HTTPS则是安全性的SSL加密传输协议。
-
HTTPS采用共享密钥加密和公开密钥加密两者并用的混合加密机制。在交换密钥阶段使用公开密钥加密方式,之后的建立通信交换报文阶段则使用共享密钥加密方式
HTTPS建立连接的过程:
- 客户端发送请求到服务器端
- 服务器端返回证书和公开密钥,公开密钥作为证书的一部分而存在
- 客户端验证证书和公开密钥的有效性,如果有效,则生成共享密钥并使用公开密钥加密发送到服务器端
- 服务器端使用私有密钥解密数据,并使用收到的共享密钥加密数据,发送到客户端
- 客户端使用共享密钥解密数据
- SSL加密建立………
常见的加密算法:
-
对称加密(加密和解密都使用相同密钥):DES,3DES
-
非对称加密(加密和解密使用不同密钥):RSA,DSA(数字签名用)
-
Hash算法:MD5,SHA,SHA-1
虚电路和数据包的区别
虚电路 | 数据包 | |
---|---|---|
思路 | 可靠通信应当由网络来保证 | 可靠通信应当由用户主机来保证 |
连接的建立 | 必须有 | 不要 |
目的站地址 | 尽在连接建立阶段使用,每个分组使用较短的虚电路号 | 每个分组都有目的站的全地址 |
分组的转发 | 属于同一条虚电路的分组按照同一路由进行转发 | 每个分组独立选择路由进行转发 |
当节点出故障时 | 所有通过出故障节点的虚电路均不能工作 | 故障节点可能丢失分组,一些路由可能会发生变化 |
分组的顺序 | 总是按发送顺序到达目的地 | 到达目的地时不一定按发送顺序 |
端到端的差错处理和流量控制 | 可以由分组交换网负责也可以由用户主机负责 | 由用户主机负责 |
分层次的路由选择协议
**互联网采用分层次的路由选择协议。**原因是:
- 互联网的规模非常大。如果让所有的路由器知道所有的网络应怎样到达,则这种路由表将非常大,处理起来也太花时间。
- 许多单位不愿意外界了解自己单位网络的布局细节和本部门所采用的路由选择协议(这属于本部门内部的事情),但同时还希望连接到互联网上。
路由选择协议可以分为两大类:
- 内部网关协议IGP:在一个自治系统内部使用的路由选择协议,如RIP和OSPF等
- 外部网关选择协议EGP:用于将路由选择信息传递给另一个自治系统中,如BGP-4
RIP:一种分布式的、基于距离度量的路由选择协议。这里的距离也称跳数,每经过一个路由器跳数加一。
RIP协议特点:
- 仅和相邻路由器交换信息、
- 交换的信息是当前本理由所知道的全部信息,即自己的路由表
- 按固定的时间间隔交换路由信息
- 好消息传的快、坏消息传的慢
OSPF:开放最短路径优先协议,特点如下:
-
向本自治系统中所有路由器发送信息,这里使用的方法是洪泛法
-
发送的信息就是与本路由器相邻的所有路由器的链路状态,但这只是路由器所知道的部分信息
链路状态”就是说明本路由器都和哪些路由器相邻,以及该链路的“度量”(metric)
-
只有当链路状态发生变化时,路由器才用洪泛法向所有路由器发送此信息
-
OSPF 的更新过程收敛得快
外部网关协议 BGP:外部网关协议,BGP 是不同自治系统的路由器之间交换路由信息的协议。互联网的规模太大,使得自治系统之间路由选择非常困难。对于自治系统之间的路由选择,要寻找最佳路由是很不现实的。
因此,边界网关协议BGP只能是力求寻找一条能够到达目的网络且比较好的路由(不能兜圈子),而并非要寻找一条最佳路由。
TCP拥塞控制机制
拥塞控制:防止过多的的数据注入到网络,不至于使网络中的路由器或链路过载。
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-NV2shT17-1585496252964)(C:\Users\dyliang\AppData\Roaming\Typora\typora-user-images\image-20200327112052516.png)]](https://i-blog.csdnimg.cn/blog_migrate/9e6250d240c79faa69f4a96d9749ad08.png)
常用的方法:
-
慢启动(减少主机发送到网络中的分组数,使路由器有足够的时间把队列中积压的分组处理完毕)
-
快重传,快恢复(减少因为拥塞导致数据包丢失带来的重传时间,从而避免传递无用的数据到网络)
慢启动算法:
1)慢启动为TCP发送发维护一个拥塞窗口(cwnd,以字节为单位),该窗口与接收窗口共同决定了发送者的发送窗口。
2)拥塞窗口初始化为1字节的报文段,当收到确认时,发送2字节的报文段。
3)若再收到2字节的报文,就发送4字节的报文,依次下去,当达到满开始门限时,改用拥塞避免算法。
4)发送方取拥塞窗口和接收窗口的最小值作为发送上限。
拥塞窗口是发送方使用的流量控制,接收窗口是接收方使用的流量控制。
慢启动的“慢”并不是指cwnd的增长速度慢,而是指在TCP开始发送报文段时先设置cwnd=1,使得发送方在开始时只发送一个报文段(目的是探测一下网络的拥塞情况),然后再逐渐增大cwnd。
拥塞避免算法:每经过一个往返时间就把拥塞窗口加1。当出现网络拥塞,就把慢开始门限减半,拥塞窗口置1,重新开始慢启动算法。
快重传机制:
超时重传是一段时间后没有收到该数据对应ACK,就重新发送数据。快重传就是发送方接收到3次以上的重复ACK,就重新发送数据,而不需要等到超时。此时,发送发执行快恢复算法。
快恢复算法:
-
当发送方连续收到三个重复确认时,就执行“乘法减小”算法,把慢开始门限减半,这是为了预防网络发生拥塞(同慢启动)。
-
由于发送方现在认为网络很可能没有发生拥塞,因此现在不执行慢开始算法,而是把cwnd值设置为慢开始门限减半后的值(而不是同慢启动一样从1开始),然后开始执行拥塞避免算法,是拥塞窗口的线性增大。
为什么说UDP是面向报文的的,而TCP是面向字节流的?
发送方的UDP对应用程序交下来的报文,在添加首部后就向下交付IP层。UDP对应用层交下来的报文既不合并也不拆分,而是保留这些报文的边界,即应用层交给UDP多长的报文,UDP都照样发送,一次发送一个报文。在接收方的UDP中对IP层交上来的UDP用户数据报,在去除首部后就原封不动的交付上层的应用进程,即UDP一次交付一个完整的报文。
TCP中的”流”指的是流入到进程和从进程流出的字节序列。 “面向字节流”的含义时:虽然应用程序和TCP的交换是一次一个数据块(大小不等),但TCP把应用程序交下来的数据看成仅仅是一连串的无结构的字节流。TCP并不知道所传送的字节流的含义。 TCP并不保证接收方应用程序所收到的数据块和发送方应用程序发送的数据块具有对应的大小关系,但是接收方应用程序收到的字节流必须和发送方应用程序发出的字节流完全一样。
流量控制
背景: 发送方的速率与接收方的速率是不一定相等,如果发送方的发送速率太快,会导致接收方处理不过来,这时候接收方只能把处理不过来的数据存在缓存区里(失序的数据包也会被存放在缓存区里)。如果缓存区满了发送方还在疯狂着发送数据,接收方只能把收到的数据包丢掉,大量的丢包会极大着浪费网络资源,因此,我们需要控制发送方的发送速率,让接收方与发送方处于一种动态平衡才好。对发送方发送速率的控制,我们称之为流量控制
做法: 接收方每次收到数据包,可以在发送确定报文的时候,同时告诉发送方自己的缓存区还剩余多少是空闲的,我们也把缓存区的剩余大小称之为接收窗口大小,用变量win来表示接收窗口的大小。发送方收到之后,便会调整自己的发送速率,也就是调整自己发送窗口的大小,当发送方收到接收窗口的大小为0时,发送方就会停止发送数据,防止出现大量丢包情况的发生。
什么是糊涂窗口综合症?
TCP接收方的缓存已满,而交互式的应用进程一次只从接收缓存中读取1字节(这样就使接收缓存空间仅腾出1字节),然后向发送方发送确认,并把窗口设置为1个字节(但发送的数据报为40字节的的话)。接收,发送方又发来1个字节的数据(发送方的IP数据报是41字节)。接收方发回确认,仍然将窗口设置为1个字节。这样,网络的效率很低。
要解决这个问题,可让接收方等待一段时间,使得或者接收缓存已有足够空间容纳一个最长的报文段,或者等到接收方缓存已有一半空闲的空间。只要出现这两种情况,接收方就发回确认报文,并向发送方通知当前的窗口大小。此外,发送方也不要发送太小的报文段,而是把数据报积累成足够大的报文段,或达到接收方缓存的空间的一半大小。
TCP中的Nagle算法是什么?
若发送方应用进程把要发送的数据逐个字节地送到TCP的发送缓存,则发送方就把第一个字节先发送出去,把后面到达的数据字节都缓存起来。当发送方收到对第一个数据字符的确认后,再把发送缓存中的所有数据组装成一个报文段发送出去,同时继续对随后到达的数据进行缓存。只有在收到对前一个报文段的确认后才继续发送下一个报文段。当数据到达较快而网络速率缓慢时,用这种方法可明显减少所用的网络带宽。
Nagle算法还规定,当到达的数据已达到发送窗口大小的一半或者报文段的最大长度时,就立即发送一个报文段。这样做,可以有效提高网络的吞吐量。
TCP中的粘包问题是如何出现的?发送方和接收方又是分别如何解决的?
在流传输中出现,UDP不会出现粘包,因为它有消息边界。出现粘包的原因有:
-
要发送的数据小于TCP发送缓冲区的大小,TCP将多次写入缓冲区的数据一次发送出去,将会发生粘包
-
接受数据端的应用层没有及时读取接收缓冲区中的数据,将发生粘包。
解决办法:
对于短连接的TCP分包不是问题,对于长连接的TCP分包有如下四种方式:
- 消息长度固定,比如muduo的roundtrip示例就采用了固定的16字节消息
- 使用特殊的字符或字符串作为消息的边界,例如HTTP协议的headers以”\r\n”为字段的分隔符
- 在每条消息的头部加一个长度字段,这恐怕是最常见的做法
- 利用消息本身的格式来分包
ipv4到ipv6的过渡手段
-
双栈策略:(最直接方式)在IPv6结点中加入IPv4协议栈。这种具有双协议栈的结点称作“IPv6/v4结点”,这些结点可以使用IPv4与IPv4结点互通,也可以直接使用IPv6与IPv6结点互通。
-
隧道技术:(为解决局部纯IPv6网络与IPv4骨干隔离形成的孤岛问题,用隧道技术的方式解决)利用穿越现存IPv4互联网的隧道技术将孤岛连接起来,逐步扩大IPv6的实现范围。在隧道的入口处,路由器将IPv6的数组分组封装进入IPv4中,IPV4分组的源地址和目的地址分别是隧道入口和出口的IPV4地址。在隧道的出口处再将IPV6分组取出转发给目的节点。
隧道技术在实践中有四种具体形式:构造隧道、自动配置隧道、组播隧道以及6to4。
-
隧道代理TB,Tunnel Broker:(目的是简化隧道的配置,提供自动的配置手段),TB可以看作是一个虚拟的IPv6 ISP,它为已经连接到IPv4网络上的用户提供连接到IPv6网络的手段,而连接到IPv4网络上的用户就是TB的客户。
-
协议转换技术:其主要思想是在V6节点与V4节点的通信时需借助于中间的协议转换服务器,此协议转换服务器的主要功能是把网络层协议头进行V6/V4间的转换,以适应对端的协议类型。
-
SOCKS64:在客户端里引入SOCKS库,它处于应用层和socket之间,对应用层的socket API和DNS域名解析API进行替换。另一种是SOCKS网关。
-
传输层中继 :与SOCKS64的工作机理相似,只不过是在传输层中继器进行传输层的“协议翻译”
-
应用层代理网关(ALG):在应用层进行协议翻译。
TIME_WAIT的意义
time_wait存在于TCP连接释放过程,在服务器A收到服务器B发送的FIN+ACK后,会向B发送ACK,进入到TIME_WAIT阶段,等待2MSL(MSL:Max Segment Lifetime,最长报文段寿命,报文段在网络中能够存活的最长时间)。

意义:
-
可靠地实现TCP全双工连接的终止:为了保证A发送的最后一个ACK报文段能够到达B。
A给B发送的ACK可能会丢失,B收不到A发送的确认,B会超时重传FIN+ACK报文段,此时A处于2MSL时间内,就可以收到B重传的FIN+ACK报文段,接着A重传一次确认,重启2MSL计时器。最后A和B都能够正常进入到CLOSED状态。
如果A在发完ACK后直接立即释放连接,而不等待一段时间,就无法收到B重传的FIN+ACK报文段,也就不会再次发送确认报文段,这样B就无法按照正常步骤进入CLOSED状态。
-
允许旧的报文段在网络中消逝
A发送确认后,该确认报文段可能因为路由器异常在网络中发生“迷途”,并没有到达B,该确认报文段可以称为旧的报文段。A在超时后进行重传, 发送新的报文段,B在收到新的报文段后进入CLOSED状态。在这之后,发生迷途的旧报文段可能到达了B,通常情况下,该报文段会被丢弃,不会造成任何的影响。但是如果两个相同主机A和B之间又建立了一个具有相同端口号的新连接,那么旧的报文段可能会被看成是新连接的报文段,如果旧的报文段中数据的任何序列号恰恰在新连接的当前接收窗口中,数据就会被重新接收,对连接造成破坏。
为了避免这种情况,TCP不允许处于TIME_WAIT状态的连接启动一个新的连接,因为TIME_WAIT状态持续2MSL,就可以保证当再次成功建立一个TCP连接的时,来自之前连接的旧的报文段已经在网络中消逝,不会再出现在新的连接中。
HTTP状态码
- 1XX Informational(信息性状态码) 接受的请求正在处理
- 2XX Success(成功状态码) 请求正常处理完毕
- 200 请求已正常处理
- 204 请求处理成功,但是没有资源返回
- 206 客户端进行了范围请求,而服务器成功执行了这部分的GET请求
- 3XX Redirection(重定向状态码) 需要进行附加操作以完成请求
- 301 永久性重定向
- 302 临时性重定向,表示请求的资源已被分配了新的URI,希望用户能使用新的URI访问
- 303 表示请求对应的资源存在着另外一个URI,应使用GET方法定向获取请求的资源
- 304 服务器资源未改变,可直接使用客户端未过期的缓存。
- 4XX client error(客户端错误状态码) 服务器无法处理请求
- 400 表示请求报文中存在语法错误
- 401 表示发送的请求需要有通过HTTP认证的认证信息
- 404 服务器没有请求的资源
- 5XX server error(服务器错误状态码)服务器处理请求
- 500 表示服务器端在执行请求时发生了错误
- 503 表示服务器处于超负荷或正在进行停机维护