1。速率:连接在计算机网络上的主机在数字信道上传送数据位数的速率
2。 带宽:数据通信领域中,数字信道所能传送的最高数据率
3。吞吐量:即在单位时间内通过某个网络的数据量
4。时延
发送时延:数据块长度/信道带宽
传播时延:信道长度/信号在信道中的传播速率
5。时延带宽积:传播时延*带宽,整段通路中的数据量;可以理解为比如1000米公路中的汽车数量
6。往返时间:RRT,发送数据开始到接受确认信息的时间
传输层提供 应用进程之间,发送端端口到接收端端口之间的服务,要进行差错检验、流量控制、面向连接或无连接的服务
每个数据包含目的地址,数据路由相互独立(路径可能变化);网络尽最大努力交付数据,但不保证不丢失、不保证先后顺序、不保证在时限内交付;网络发生拥塞时,可能会将一些分组丢弃;
此部分可以参考:bilibili韩立刚计算机网络视频
第一次握手:Client将SYN置1,随机产生一个初始序列号seq发送给Server,进入SYN_SENT状态;
第二次握手:Server收到Client的SYN=1之后,知道客户端请求建立连接,将自己的SYN置1,ACK置1,产生一个acknowledge number=sequence number+1,并随机产生一个自己的初始序列号,发送给客户端;进入SYN_RCVD状态;
第三次握手:客户端检查acknowledge number是否为序列号+1,ACK是否为1,检查正确之后将自己的ACK置为1,产生一个acknowledge number=服务器发的序列号+1,发送给服务器;进入ESTABLISHED状态;服务器检查ACK为1和acknowledge number为序列号+1之后,也进入ESTABLISHED状态;完成三次握手,连接建立。
client 发出的第一个连接请求报文段并没有丢失,而是在某个网络结点长时间的滞留了,以致延误到连接释放以后的某个时间才到达server。本来这是一个早已失效的报文段。但 server 收到此失效的连接请求报文段后,就误认为是 client再次发出的一个新的连接请求。于是就向 client 发出确认报文段,同意建立连接。假设不采用 “三次握手”,那么只要 server发出确认,新的连接就建立了。由于现在 client 并没有发出建立连接的请求,因此不会理睬 server 的确认,也不会向 server发送数据。但 server 却以为新的运输连接已经建立,并一直等待 client 发来数据。这样,server的很多资源就白白浪费掉了。采用 “三次握手” 的办法可以防止上述现象发生。例如刚才那种情况,client 不会向 server的确认发出确认。server 由于收不到确认,就知道 client 并没有要求建立连接。
可以。但是会降低传输的效率。
四次握手是指:第二次握手:Server只发送ACK和acknowledge number;而Server的SYN和初始序列号在第三次握手时发送;原来协议中的第三次握手变为第四次握手。出于优化目的,四次握手中的二、三可以合并。
由于Server没有收到ACK确认,因此会重发之前的SYN+ACK(默认重发五次,之后自动关闭连接进入CLOSED状态),Client收到后会重新传ACK给Server。
在Server进行超时重发的过程中,如果Client向服务器发送数据,数据头部的ACK是为1的,所以服务器收到数据之后会读取 ACK number,进入 establish 状态
在Server进入CLOSED状态之后,如果Client向服务器发送数据,服务器会以RST包应答。
服务器每收到一次客户端的请求后都会重新复位一个计时器,时间通常是设置为2小时,若两小时还没有收到客户端的任何数据,服务器就会发送一个探测报文段,以后每隔75秒钟发送一次。若一连发送10个探测报文仍然没反应,服务器就认为客户端出了故障,接着就关闭连接。
TCP连接的一方A,随机选择一个32位的序列号(Sequence Number)作为发送数据的初始序列号(Initial Sequence Number,ISN),比如为1000,以该序列号为原点,对要传送的数据进行编号:1001、1002…三次握手时,把这个初始序列号传送给另一方B,以便在传输数据时B可以确认什么样的数据编号是合法的;同时在进行数据传输时,A还可以确认B收到的每一个字节,如果A收到了B的确认编号(acknowledge number)是2001,就说明编号为1001-2000的数据已经被B成功接受。
客户端通过TCP首部告知服务端自己的接收缓存大小
服务端接收TCP数据包,按接收缓存设置自己的发送窗口大小
服务端发送数据,客户端收到之后,发送确认号=收到的数据包编号+1,窗口滑动
服务端收到确认号,窗口右移,删除已经发送的数据包
有丢包的情况之下,发送相关的确认号,再加一个选择性确认号SACK,让服务端知道丢了什么包,重传丢包
什么是零窗口(接收窗口为0时会怎样)?
如果接收方没有能力接收数据,就会将接收窗口设置为0,这时发送方必须暂停发送数据,但是会启动一个持续计时器(persistence timer),到期后发送一个大小为1字节的探测数据包,以查看接收窗口状态。如果接收方能够接收数据,就会在返回的报文中更新接收窗口大小,恢复数据传送。
拥塞:路由器忙不过来,给的数据包越多,收到的数据包越少
拥塞控制主要由四个算法组成:慢启动、拥塞避免、快重传、快恢复
1.慢开始:指数增大
2.拥塞避免:线性增大
当出现网络拥塞之后,重新计算慢开始门限:出现网络拥塞窗口大小的一半
3.快重传
客户端确认丢包之后比如收到了1 2 4,就知道丢了3 ,此时不等待接受的窗口大小 5 填满数据,直接连发三个确认号,让服务端重发丢包3。收到快重传之后进入快恢复的阶段,不再从零开始。而是直接从新的慢开始门限阈值开始
快重传要求接收方在收到一个失序的报文段后就立即发出重复确认(为的是使发送方及早知道有报文段没有到达对方)而不要等到自己发送数据时捎带确认。快重传算法规定,发送方只要一连收到三个重复确认就应当立即重传对方尚未收到的报文段,而不必继续等待设置的重传计时器时间到期。
4. 快恢复:
当发送方连续收到三个重复确认时,就把慢开始门限减半,然后执行拥塞避免算法。不执行慢开始算法的原因:因为如果网络出现拥塞的话就不会收到好几个重复的确认,所以发送方认为现在网络可能没有出现拥塞。
第一次挥手:Client将FIN置为1,发送一个序列号seq给Server;进入FIN_WAIT_1状态;
第二次挥手:Server收到FIN之后,发送一个ACK=1,acknowledge number=收到的序列号+1;进入CLOSE_WAIT状态。此时客户端已经没有要发送的数据了,但仍可以接受服务器发来的数据。
第三次挥手:Server将FIN置1,发送一个序列号给Client;进入LAST_ACK状态;
第四次挥手:Client收到服务器的FIN后,进入TIME_WAIT状态;接着将ACK置1,发送一个acknowledge number=序列号+1给服务器;服务器收到后,确认acknowledge number后,变为CLOSED状态,不再向客户端发送数据。客户端等待2*MSL(报文段最长寿命)时间后,也进入CLOSED状态。完成四次挥手。
因为服务器收到客户端断开连接的请求时,可能还有一些数据没有发完,这时先回复ACK,表示接收到了断开连接的请求。等到数据发完之后再发FIN,断开服务器到客户端的数据传送。
客户端没有收到ACK确认,会重新发送FIN请求。
第四次挥手时,客户端发送给服务器的ACK有可能丢失,TIME_WAIT状态就是用来重发可能丢失的ACK报文。如果Server没有收到ACK,就会重发FIN,如果Client在2*MSL的时间内收到了FIN,就会重新发送ACK并再次等待2MSL,防止Server没有收到ACK而不断重发FIN。
MSL(Maximum Segment Lifetime),指一个片段在网络中最大的存活时间,2MSL就是一个发送和一个回复所需的最大时间。如果直到2MSL,Client都没有再次收到FIN,那么Client推断ACK已经被成功接收,则结束TCP连接。
窗口:即滑动窗口大小,见TCP如何实现流量控制?
带宽:这里带宽是指单位时间内从发送端到接收端所能通过的“最高数据率”,是一种硬件限制。TCP发送端和接收端的数据传输数不可能超过两点间的带宽限制。发送端和接收端之间带宽取所通过线路的带宽最小值(如通过互联网连接)。
RTT:即Round Trip Time,表示从发送端到接收端的一去一回需要的时间,TCP在数据传输过程中会对RTT进行采样(即对发送的数据包及其ACK的时间差进行测量,并根据测量值更新RTT值),TCP根据得到的RTT值更新RTO值,即Retransmission TimeOut,就是重传间隔,发送端对每个发出的数据包进行计时,如果在RTO时间内没有收到所发出的数据包的对应ACK,则任务数据包丢失,将重传数据。一般RTO值都比采样得到的RTT值要大。
在我们平时生活中使用的宽带网络因为带宽都比较小,从而 也比较小,再加上网络情况比较复杂,拥塞情况比较常见,所以这些网络环境下,TCP速率的主要限制因素在于带宽,丢包率等。局域网络,在这些网络中速率的主要限制因素就是窗口大小了
TCP是面向连接的,UDP是无连接的;
什么叫无连接?
UDP发送数据之前不需要建立连接
TCP是可靠的,UDP不可靠;
什么叫不可靠?
UDP接收方收到报文后,不需要给出任何确认
TCP只支持点对点通信,UDP支持一对一、一对多、多对一、多对多;
TCP是面向字节流的,UDP是面向报文的;
什么意思?
面向字节流是指发送数据时以字节为单位,一个数据包可以拆分成若干组进行发送,而UDP一个报文只能一次发完。
TCP有拥塞控制机制,UDP没有。网络出现的拥塞不会使源主机的发送速率降低,这对某些实时应用是很重要的,比如媒体通信,游戏;
TCP首部开销(20字节)比UDP首部开销(8字节)要大
UDP 的主机不需要维持复杂的连接状态表
对某些实时性要求比较高的情况,选择UDP,比如游戏,媒体通信,实时视频流(直播),即使出现传输错误也可以容忍;
其它大部分情况下,HTTP都是用TCP,因为要求传输的内容可靠,不出现丢失,比如HTTP不可以使用UDP,HTTP需要基于可靠的传输协议,而UDP不可靠
数据包校验
对失序数据包重新排序(TCP报文具有序列号)
丢弃重复数据
应答机制:接收方收到数据之后,会发送一个确认(通常延迟几分之一秒);
超时重发:发送方发出数据之后,启动一个定时器,超时未收到接收方的确认,则重新发送这个数据;
流量控制:确保接收端能够接收发送方的数据而不会缓冲区溢出
自动重传请求是OSI模型中数据链路层和传输层的错误纠正协议之一。它通过使用确认和超时这两个机制,在不可靠服务的基础上实现可靠的信息传输。
停止等待协议是为了实现可靠传输的,它的基本原理就是每发完一个分组就停止发送,等待对方确认(回复ACK)。如果过了一段时间(超时时间后),还是没有收到 ACK 确认,说明没有发送成功,需要重新发送,直到收到确认后再发下一个分组。
在停止等待协议中,若接收方收到重复分组,就丢弃该分组,但同时还要发送确认。
优缺点:
1) 无差错情况:
发送方发送分组,接收方在规定时间内收到,并且回复确认.发送方再次发送。
2) 出现差错情况(超时重传):
停止等待协议中超时重传是指只要超过一段时间仍然没有收到确认,就重传前面发送过的分组(认为刚才发送过的分组丢失了)。因此每发送完一个分组需要设置一个超时计时器,其重传时间应比数据在分组传输的平均往返时间更长一些。这种自动重传方式常称为 自动重传请求 ARQ 。另外在停止等待协议中若收到重复分组,就丢弃该分组,但同时还要发送确认。连续 ARQ 协议 可提高信道利用率。发送维持一个发送窗口,凡位于发送窗口内的分组可连续发送出去,而不需要等待对方确认。接收方一般采用累积确认,对按序到达的最后一个分组发送确认,表明到这个分组位置的所有分组都已经正确收到了。
3) 确认丢失和确认迟到
- 确认丢失 :确认消息在传输过程丢失。当A发送M1消息,B收到后,B向A发送了一个M1确认消息,但却在传输过程中丢失。而A并不知道,在超时计时过后,A重传M1消息,B再次收到该消息后采取以下两点措施:1. 丢弃这个重复的M1消息,不向上层交付。 2. 向A发送确认消息。(不会认为已经发送过了,就不再发送。A能重传,就证明B的确认消息丢失)。
- 确认迟到 :确认消息在传输过程中迟到。A发送M1消息,B收到并发送确认。在超时时间内没有收到确认消息,A重传M1消息,B仍然收到并继续发送确认消息(B收到了2份M1)。此时A收到了B第二次发送的确认消息。接着发送其他数据。过了一会,A收到了B第一次发送的对M1的确认消息(A也收到了2份确认消息)。处理如下:1. A收到重复的确认后,直接丢弃。2. B收到重复的M1后,也直接丢弃重复的M1。
连续 ARQ 协议可提高信道利用率。发送方维持一个发送窗口,凡位于发送窗口内的分组可以连续发送出去,而不需要等待对方确认。接收方一般采用累计确认,对按序到达的最后一个分组发送确认,表明到这个分组为止的所有分组都已经正确收到了。
优缺点:
GET“读取“一个资源。比如Get到一个html文件。反复读取不应该对访问的数据有副作用。
post,比如提交表单,一般会有影响,不能缓存
GET是幂等的,即读取同一个资源,总是得到相同的数据,POST不是幂等的;GET在浏览器回退时是无害的,而POST会再次提交请求。
GET一般用于从服务器获取资源,而POST有可能改变服务器上的资源;具体来说,GET 一般用于获取/查询资源信息,而 POST 一般用于更新资源信息
GET参数通过URL传递,POST放在Request body中。
安全性:GET请求参数会被完整保留在浏览器历史记录里,而POST中的参数不会被保留。
GET只允许ASCII字符,POST对数据类型没有要求
GET的长度有限制(操作系统或者浏览器),而POST数据大小无限制
Session是服务器端保持状态的方案,Cookie是客户端保持状态的方案
Cookie保存在客户端本地,客户端请求服务器时会将Cookie一起提交;Session保存在服务端,通过检索Sessionid查看状态。保存Sessionid的方式可以采用Cookie,如果禁用了Cookie,可以使用URL重写机制(把会话ID保存在URL中)。
浏览器打开一个网页,用到的是HTTP协议,它是无状态的,这一次请求和上一次请求是没有任何关系的,互不认识的,没有关联的。好处是快速,但是不方便,于是基于这种需求就出现了Cookie
Cookie 是帮助web站 保留访问者信息的技术,是存储在用户电脑上的小文件,保存一些站点的用户数据,这样能够让服务器为这样的用户定制内容。一般保存时间为7-30天
比如:免用户名登录。
第一次登录成功之后,服务器给浏览器发送了用户名和密码的cookie,浏览器存储
下一次浏览器又要登录时,在发送请求头的时候一起把cookie发送给服务器
服务器解析出直接填入用户名和密码实现免用户名登录
Cookie虽好,但是存在于用户端,存储的尺寸大小有限,用户可见,并可以随意的修改,很不安全。那如何又要安全,又可以方便的全局读取信息呢?于是,这个时候,一种新的存储会话机制:Session 诞生了。
会话:打开浏览器到关闭浏览器的这个过程
Session会话:每次我们访问一个页面,会自动生成一个session_id 来标注是这次会话的唯一ID,同时也会自动往cookie里写入,当这次会话没结束,再次访问的时候,服务器会去读取这个cookie是否有值有没过期,如果能够读取到,则继续用这个session_id,如果没有,就会新生成一个session_id,同时生成新的cookie。
- 浏览器查询 DNS,获取域名对应的IP地址:具体过程包括浏览器搜索自身的DNS缓存对于向本地DNS服务器进行查询,如果要查询的域名包含在本地配置区域资源中,则返回解析结果给客户机,完成域名解析(此解析具有权威性);如果要查询的域名不由本地DNS服务器区域解析,但该服务器已缓存了此网址映射关系,则调用这个IP地址映射,完成域名解析(此解析不具有权威性)。如果本地域名服务器并未缓存该网址映射关系,那么将根据其设置发起递归查询或者迭代查询;
- 浏览器获得域名对应的IP地址以后,浏览器向服务器请求建立链接,发起三次握手;
- TCP/IP链接建立起来后,浏览器向服务器发送HTTP请求;
- 服务器接收到这个请求,并根据路径参数映射到特定的请求处理器进行处理,并将处理结果及相应的视图返回给浏览器;
- 浏览器解析并渲染视图,若遇到对js文件、css文件及图片等静态资源的引用,则重复上述步骤并向服务器请求这些资源;
- 浏览器根据其请求到的资源、数据渲染页面,最终向用户呈现一个完整的页面。
- 在浏览器中输入www.baidu.com域名,操作系统会先检查自己本地的hosts文件是否有这个域名的映射关系,如果有,就先调用这个IP地址映射,完成域名解析。
- 如果hosts文件中没有,则查询本地DNS解析器缓存,如果有,则完成地址解析。
- 如果本地DNS解析器缓存中没有,则去查找本地DNS服务器,如果查到,完成解析。
- 如果没有,则本地服务器会向根域名服务器发起查询请求。根域名服务器会告诉本地域名服务器去查询哪个顶级域名服务器。
- 本地域名服务器向顶级域名服务器发起查询请求,顶级域名服务器会告诉本地域名服务器去查找哪个权限域名服务器。
- 本地域名服务器向权限域名服务器发起查询请求,权限域名服务器告诉本地域名服务器www.baidu.com所对应的IP地址。
- 本地域名服务器告诉主机www.baidu.com所对应的IP地址。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-WDKr1wLC-1620217439970)(image/计算机网络/1620214330460.png)]
ARP协议完成了IP地址与物理地址的映射。每一个主机都设有一个 ARP 高速缓存,里面有所在的局域网上的各主机和路由器的 IP 地址到硬件地址的映射表。
当源主机要发送数据包到目的主机时,会先检查自己的ARP高速缓存中有没有目的主机的MAC地址,如果有,就直接将数据包发到这个MAC地址
如果没有,就向所在的局域网发起一个ARP请求的广播包: APR请求:我是 209.0.0.5,硬件地址是 00-00-C0-15-AD-18,我想知道主机 209.0.0.6 的硬件地址,收到请求的主机检查自己的IP地址和目的主机的IP地址是否一致,如果一致,则先保存源主机的映射到自己的ARP缓存,然后给源主机发送一个ARP响应数据包。APR响应:我是 209.0.0.6,硬件地址是 08-00-2B-00-EE-0A
源主机收到响应数据包之后,先添加目的主机的IP地址与MAC地址的映射,再进行数据传送。如果源主机一直没有收到响应,表示ARP查询失败。
如果所要找的主机和源主机不在同一个局域网上,那么就要通过 ARP 找到一个位于本局域网上的某个路由器的硬件地址,然后把分组发送给这个路由器,让这个路由器把分组转发给下一个网络。剩下的工作就由下一个网络来做。
首部中存储了很多信息,包括主机IP和目的IP
为了提高 IP 数据报交付成功的机会,用于获取数据包的发送情况,允许主机或路由器报告差错情况和提供有关异常情况的报告。
ping是ICMP(网际控制报文协议)中的一个重要应用,ICMP是网络层的协议。ping的作用是测试两个主机的连通性。
ping的工作过程:
IP地址被用来给Internet上的电脑一个编号。大家日常见到的情况是每台联网的PC上都需要有IP地址,才能正常通信。
IP地址包含 网络地址+主机地址,即IP地址=网络地址+主机地址
网络地址:同一网络上的网络号相同,也叫划分子网
子网掩码只有一个作用,就是将某个IP地址划分成网络地址和主机地址两部分。
通过子网掩码,就可以判断两个IP在不在一个局域网内部。
子网掩码可以看出有多少位是网络号,有多少位是主机号
网关实质上是一个网络通向其他网络的IP地址。默认网关在网络层上以实现网络互连.
将不再一个网段的请求转发出去,相当于大型地区中转站
链路:既物理链路
数据链路:用某种协议传输数据的链路
封装成帧
透明传输
差错检测:循环冗余码CRC + FCS冗余码
硬件地址又称为物理地址,或 MAC 地址。在路由器发送的报文中目标Mac地址是下一跳路由器的mac地址,但是目标IP地址则是真正的终点IP地址,工作在数据链路层的交换机维护着计算机MAC地址和自身端口的数据库,交换机根据收到的数据帧中的“目的MAC地址”字段来转发数据帧。
IP地址是和地域相关的,对于同一个子网上的设备,IP地址的前缀都是一样的,这样路由器通过IP地址的前缀就知道设备在在哪个子网上了,而只用MAC地址的话,路由器则需要记住每个MAC地址在哪个子网,这需要路由器有极大的存储空间,是无法实现的。
IP地址可以比作为地址,MAC地址为收件人,在一次通信过程中,两者是缺一不可的。
物理层:专门负责数据的传输,上面派发了数据包,那他就考虑数据具体怎么传,用什么编码方式、如何调制解调、从哪来,传到哪就ok,如何更快的传输(光纤),相当于一个快递员,盲目的干活就可以。确定与传输媒体的接口的一些标准和特性
数据链路层:传输过程中的规章制度,内容怎么安排?出错了怎么办?传输的方式是点到点还是广播?
网络层:选择相关的路由
传输层:计算机用端口号标识,进入传输层基于相关的TCP/UDP协议发送
应用层:是面向用户的软件,提供各种协议下的服务。分为服务端、客户端。用户控制软件,发出相关的服务请求,形成相应的进程、数据。
最常见的12道计算机网络的面试题
javaGuide
常见七层协议及各层的作用
计算机网络面试题