计算机网络-面试

TCP怎么保证可靠性

序列号,确认序列号 确认应答和超时重传
当接收方接受到消息之后会发送一个ACK报文给发送方 报文中有一个确认序列号 就是接收到的报文的序列号+1 说明没有接收错报文 如果没有发送方没有接收到这个ACK报文 就会超时重传 也就是在等待2RTT(也就是两个报文往返时间)+一个偏差值后重新发送
窗口控制和快速重发

窗口控制能提高传输效率 他不用等到发送方应答才发送下一条数据
那么如何保证数据的可靠 如果接收方并没有按顺序接受到预想中的数据 例如序列号一般接受到 1 2 3 5中间没有接受到4 直接接受到了5 那么接收方就会一直发送确认序列号为3的ACK报文给发送方 如果发送方连续接受到三次(三次的原因是 就算发送端是按序列号发送的报文 在传输过程中因为是TCP包封装在IP包里 一样可能造成乱序 而乱序一般是造成两次乱序 乱序造成三次冗余的概率是百分之四十 而三次更大概率是丢包了 所以选择了三次 为啥不选择四次五次 主要是因为这样会造成响应太慢 三次是实践经验吧 )相同的ACK报文那么就会重发这个序列号的报文保证数据的准确
拥塞控制
拥塞控制就有慢开始 拥塞避免
慢开始就是一开始值发送一点点数据 这个一点点的定义就是一开始将拥塞窗口设置为1 每接受到一次应答(也就是一个rtt)就2
拥塞避免就是这个拥塞窗口的增长有个上限值 到了这个设定的上限值后就不再
2增长 而是每次+1 如果发生了堵塞(可以看做发生了超时重传) 那么这个上限就会变为一般 拥塞窗口又从1开始 重复慢开始
流量控制
利用滑动窗口实现流量控制 就是每次发送的消息只能在滑动窗口的限制范围之内 如果一次发送太多可能被撑爆 接收方的确认报文中会有窗口字段 确认发送方窗口的大小

HTTP(超文本传输协议)

http就是一个请求-响应协议标准 主要是规定数据的一个格式
http有post get head请求
不只是能包含html 还可以包含图片文字 视屏二进制的各种数据
每个TCP都最初只能发送一个请求
http1.x的数据是基于一个字符串的 基于一个文本格式的
而http2.0就是一个二进制的格式
就是在在两方建立好了TCP链接之后 按照HTTP协议标准进行数据传输
作用是对前后端(浏览器和服务端)数据传输做一个规范
默认是在TCP协议的80端口
HTTP是以明文的方式传递信息 结束后就会断开链接
而HTTP在1.0的时候 浏览器每次发起HTTP请求都需要和服务端创建一个新的TCP链接 每次创建和关闭请求都需要耗费时间 如果将connection设置为keep aLive(长链接)就会告诉对方这个请求响应暂时不要关闭
但是keepalive也有缺点 就是长时间保持TCP链接容易导致系统资源被无效占用 所以选了个折中的办法就是完成最后一个HTTP请求之后就设置固定数秒关闭TCP链接

长链接和短链接

主要应用场景就是短链接 用于多并发交流没那么频繁的 客户端连接数较多 淘宝京东那种 长链接就是交流比较频繁 点对点那种 网路游戏 通讯等

长链接的优点

减少握手的次数 也就是不需要每次都建立链接 然后三次握手四次挥手
减少慢启动的影响 因为为了避免拥塞 拥塞控制 TCP就采取了慢启动

HTTPS

就是在HTTP协议的基础上添加了身份验证和传输加密 保证了传输的安全
用的TCP端口就是443

HTTPS工作流程

客户端会先发起一个HTTPS请求给服务端 然后会链接上服务器的443端口
这个HTTPS请求里面包含了自己的加密算法列表(加密算法列表就是告诉服务端自己支持那些加密算法)和秘钥长度

服务端就会通过这个加密算法列表选择一个合适这个客户端的加密算法连同加密组件一起发送给客户端

服务端再向客户端发送一个包含数字证书的报文

然后服务端就会再发送一个完成协商报文告诉客户端SSL第一阶段协商已经完成

第一阶段完成之后客户端会回一个回应报文 告诉服务端之后的内容都用pre_master_secre(密码规范)加密
然后再向服务端发送一个结束报文 这次握手中包含第一次握手至今所有报文的整体校验值,最终协商是否完成取决于服务端能否成功解密。
然后服务端会发送一个和①一样的报文给客户端 让客户端确认
最后服务端发送一个finish报文告诉客户端自己正确解密了
当服务端和客户端的 finish 报文交换完成之后,SSL 连接就算建立完成了,之后就进行和 HTTP 相同的通信过程,唯一不同的是在 HTTP 通信过程中并不是采用明文传输,而是采用对称加密的方式,其中对称密钥已经在 SSL 的建立过程中协商好了

HTTP和HTTPS的区别

HTTP是以明文进行数据传输 而HTTPS会对数据进行TLS加密
HTTPS在三次握手之后还需要进行SSL握手
HTTPS还要申请服务端申请证书 浏览器端需要安装对应的根证书
HTTP端口是80 而HTTPS端口是443
HTTPS的有点就是安全性更高 但是缺点是握手端延时较高就是三次握手之后还需要SSL握手 要数字认证机构申请证书 需要一定费用
HTTPS还需要对传输数据进行解密 占用更多CPU资源

状态码(HTTP返回码)

200 请求成功
204 请求成功但无内容返回
206 范围请求成功

301 永久重定向; 30(2|3|7)临时重定向,语义和实现有略微区别;
304 带if-modified-since 请求首部的条件请求,条件没有满足

400 语法错误
401 需要认证信息
403 拒绝访问
404 找不到资源
412 除if-modified-since 以外的条件请求,条件未满足

500 服务器错误
503 服务器宕机了

IP地址和MAC地址

MAC地址是一个硬件地址 用来定义网络设备的位置 数据链路层负责
IP地址是IP协议提供 为互联网上每一个网络每一个主机分配一个逻辑地址屏蔽物理地址的差异

七层模型

物理层 (比特)实现计算机之间的比特流的透明传输 尽量屏蔽掉传输设备和物理设备之间的物理差异 方便链路层传输 不需要在考虑网络的传输介质是什么 IEE8802.3
数据链路层(帧) 两台主机就是在链路上进行数据交换 将网络层传递下来的网络数据组装成帧 MAC VLAN PPP 主要解决一个局域网内的通信
网络层(IP层)(包) 选择合适的网间路由和交换节点 将传输层的报文装成分组和包 发送个任何的网络并且进行一个路由的选择
传输层(报文) 传递报文和错误恢复 实现端到端或者进程到进程之间的通信 所以他主要是为了实现可靠链接
会话层(SPDU) 建立 管理 终止对话 RPC NFS
表示层(PPDU) 对数据进行翻译加密传输 使通信的应用程序能解释交换数据的含义 就是帮助程序理解交换来的数据的意义 JPEG
应用层(APDU) 定义了用户之间的交互规则 FTP HTTP DNS

四层模型
网络接口层:MAC VLAN

网络层:IP 主要解决主机到主机的 包括路由

传输层:TCP UDP 主要解决进程到进程的

应用层:HTTP DNS SMTP

搜索baidu,会用到计算机网络中的什么层?每层是干什么的

输入URL(域名)之后 浏览器会先将域名转换为HTTP请求的格式 然后再就会用到DNS将域名解析为IP地址 主要会先在DNS缓存中查 也就是如果以前缓存记录了 就直接返回 如果没有 再到本地的DNS中查 然后就是DNS的迭代查询和递归查询了 最终查询到IP地址
得到IP地址之后就浏览器就通过HTTP协议与服务器建立HTTP链接 然后HTTP生成一个get请求报文给TCP 如果用到的是HTTPS还会用HTTPS对HTTP协议进行加密

然后TCP的数据包会发送给IP层
IP层通过路由选择发送到目标地址
ip地址转换为mac地址
服务器处理请求 返回HTTP报文 就会返回一个HTML响应
浏览器解析渲染页面

socket(套接字)

是对TCP/IP的封装 提供一个可以网络开发的接口
运行在计算机中的两个程序 通过socket建立气啦的通道 数据在socket中传输
可以理解为网络层和传输层之间的门
socket有流和数据报两种通信机制 流是基于TCP的 数据报基于是UDP的
所以他们同样继承了 流是双向字节流通道 有序可靠的 传输数据不会丢失重复或乱序
而数据报就是不需要建立链接 和维持链接 也不可靠 就是效率更高
语音聊天 或者视频应该就是UDP 因为有的时候会卡顿啊 或者电音 那些就是数据丢失了 然后并不会进行数据重传

什么是socket?

    socket顾名思义就是套接字的意思,用于描述地址和端口,是一个通信链的句柄。应用程序通过socket向网络发出请求或者回应。

    socket编程有三种,流式套接字(SOCK_STREAM),数据报套接字(SOCK_DGRAM),原始套接字(SOCK_RAW),前两者较常用。基于TCP的socket编程是流式套接字。

三、client/server即C/S模式:

   TCP/IP通信中,主要是进行C/S交互。废话不多说,下面看看具体交互内容:

   服务端:建立socket,申明自身的port和IP,并绑定到socket,使用listen监听,然后不断用accept去查看是否有连接。如果有,捕获socket,并通过recv获取消息的内容,通信完成后调用closeSocket关闭这个对应accept到的socket。如果不需要等待任何客户端连接,那么用closeSocket直接关闭自身的socket。

    客户端:建立socket,通过端口号和地址确定目标服务器,使用Connect连接到服务器,send发送消息,等待处理,通信完成后调用closeSocket关闭socket。

osi模型和TPC/IP模型区别

面向链接

面向链接就是需要先建立链接然后才能发送数据 数据传输完成后需要释放连接

无链接

直接进行数据传输
IP协议就是无连接的

区别

osi的网络层是无连接+面向链接
TCP/IP的网络层是无链接
osi的传输层是面向链接
TCP/IP的传输层是无连接+面向连接
TCP/IP协议最开始就是为了解决异构网络问题 也就是不同网络之间的链接 所以他网络层更看重IP协议 也就是无连接

一个数据是怎么从电脑传下来的

一个电脑发送的数据会在应用层添加一些控制信息就组成了报文
然后把这一堆报文切分成段形 再将这些成段的报文再加上传输层的控制协议 比如HTTP啥的 就成了报文段
然后在网络层加上网络层的控制信息就变成了数据报
再在数据报的头和尾加上数据链路层的控制信息就变成了变成
在物理层就直接将帧转成比特流的形式 也就是二进制的形式 然后将这些比特放到链路上面进行传输

正向代理 反向代理是什么 负载均衡是什么

队头阻塞是什么

对称加密算法是什么

TLS/SSL协议是怎样保证信息安全的

HTTP2.0优点

1.1的缺点 header太长了 什么都往cookie里面放

什么是多路复用 和消息推送 HPACK编码

HTTP链接 socket链接 TCP链接的区别

HTTP链接

http链接最显著的特点是客户端每次发送的请求都需要服务端回送响应 在请求结束后会主动释放链接

TCP沾包问题

主要是因为TCP是以流的方式进行数据传输的 但是我们在发送数据的时候一般就是以数据包的形式进行发送的 所以 那么如果我们发送了三个包 按频率发送200 250 100 按正常解析也应该是解析为三个包 但是接收方并不是按频率来接受的 所有就可能因为网速的原因 有的数据传输就更快 有的更慢 所以接受一次就接受了550字节的 那么就导致了接收方并不能把这些包拆开 导致了多个数据包沾包的问题

解决方案

一种是基于一些网路协议 例如HTTP或者HTTPS封装传输不定长的数据包
在每个数据包尾部加上特定的字符代表传输结束了 但是这个方法有缺陷 就是他需要一个字节一个字节的接受数据 每接受一个字节就判断一次
第三种就是添加一个数据头(存储当前字节的总字节数) 先接受数据头 然后根据数据头中提供的字节大小来接受剩下的数据 第三个方法是比较常见的方法

发送的TCP包太大

会导致分片问题 因为在数据链路层网络对数据帧会有限制MTU为1500字节 如果超过了就会分片

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值