1.介绍一下OSI、TCP/IP和五层协议体系
- OSI(7层):应用层、表示层、会话层、运输层、网络层、数据链路层、物理层
- TCP/IP(4层)传输控制协议/网络协议:应用层、运输层、网络层、网络接口层
- 五层:应用层、运输层、网络层、数据链路层、物理层
2.五层协议体系各层的作用是什么?
- 应用层:通过应用进程的交互完成网络应用。常见应用层协议如下:
- DNS域名系统:将域名与ip地址相互映射的一个分布式数据库,方便人们访问互联网,而不用记住IP地址;
- HTTP超文本传输协议:提供了一种发布HTML页面的方法。
- SMTP简单邮件传输协议
- 运输层:为进程通信提供数据服务。数据传输协议共两种:
- TCP传输控制协议:面向连接,保证数据可靠性;
- UDP用户数据协议:无连接,不保证可靠性
- 网络层:使用IP协议将运输层数据封装为IP数据报,在通信过程中选择合适的网间路由和交换节点,保证数据及时传送。
- 数据链路层:将IP数据报组装成帧,在链路上的相邻节点间进行传输;
- 物理层:实现了比特流的传送
3.描述一下TCP的三次握手和四次挥手
- 建立连接时,三次握手,确认双方与对方的发送接收正常:
- 客户端-发送SYN数据包,服务端确认了自己接收正常,对方发送正常;
- 服务端-发送SYN/ACK数据包,客户端确认了双方发送接收正常;
- 客户端-发送ACK数据包,服务端确认了自己发送,对方接收正常;
- 断开连接时,四次挥手:
-
客户端-发送FIN,关闭客户端到服务器的数据传输,进入半关闭;
-
服务端-收到FIN,发送ACK,确认序号为收到的序号加1; 这一阶段服务端依旧可以向客户端发送消息
-
服务端-发送FIN;
-
客户端-收到FIN,发送ACK,确认序号为收到的序号加1; 补充:ack是一种消息响应,SYN和FIN是一种信号
-
4.为什么要三次握手和四次挥手?
- 三次握手: 第三次握手是为了防止失效的连接请求到达服务器,让服务器错误打开连接。
客户端发送的连接请求如果在网络中滞留,那么就会隔很长一段时间才能收到服务器端发回的连接确认。客户端等待一个超时重传时间之后,就会重新请求连接。但是这个滞留的连接请求最后还是会到达服务器,如果不进行三次握手,那么服务器就会打开两个连接。如果有第三次握手,客户端会忽略服务器之后发送的对滞留连接请求的连接确认,不进行第三次握手,因此就不会再次打开连接。
- 四次挥手
客户端发送了 FIN 连接释放报文之后,服务器收到了这个报文,就进入了 CLOSE-WAIT 状态。这个状态是为了让服务器端发送还未传送完毕的数据,传送完毕之后,服务器会发送 FIN 连接释放报文。
客户端接收到服务器端的 FIN 报文后进入Time-wait状态,此时并不是直接进入 CLOSED 状态,还需要等待一个时间计时器设置的时间 2MSL。这么做有两个理由:
- 确保最后一个确认报文能够到达。如果 服务端 没收到 客户端 发送来的确认报文,那么就会重新发送连接释放请求报文,客户端 等待一段时间就是为了处理这种情况的发生。
- 等待一段时间是为了让本连接持续时间内所产生的所有报文都从网络中消失,使得下一个新的连接不会出现旧的连接请求报文。
5. TCP和UDP的区别
- TCP传输控制协议:面向连接,传输前建立连接,传输后释放连接,效率慢,保证数据可靠性。一般用于文件传输、收发邮件等。
- UDP用户数据协议:无连接,效率快,不保证可靠性。一般用于即时消息通信,如QQ语音视频、直播等。
6.TCP和UDP的协议格式了解吗?
TCP和UDP协议格式如下:
- UDP各部分含义:
- 源端口号和对端口号:表示了哪两个主机进行通信;
- 数据报长度:完整UDP报文长度;
- 校验和:检验收发数据是否一致;
- TCP各部分含义:
- 序号和确认序号进行包管理,对数据进行排序
- 头长:标识tcp头部大小;
- 标志位:ACK、SYN、FIN
- 窗口大小:TCP流量控制窗口大小
- 紧急指针:发送紧急数据时会用到
- 选项数据:一个可选的信息
7.TCP发数据过程中必须按顺序接收吗?
在TCP协议当中,每个包都有一个短期不重复的序列号。数据达到主机不一定按照顺序,但是TCP协议栈会自动排序再交到应用层。
8.TCP如何保证传输的可靠性?
校验和、流量控制、拥塞控制、ARQ协议、超时充传机制
- 校验和:校验和有误,则丢弃当前报文段;
- 流量控制:接收方有一个固定的缓冲区,发送方只允许发送缓冲区能接纳的数据,如果接收方来不及处理,则通知发送方降低发送速率,防止包丢失。TCP使用滑动窗口来进行流量控制,确认方通过报文中的窗口字段,影响发送方速率。
- 拥塞控制:当网络拥塞时减少数据发送。TCP维护拥塞窗口cwnd变量(还有拥塞门限ssthresh),并进行动态变化。有慢开始、拥塞避免、快重传、快恢复四种算法。
- 慢开始:cwnd < ssthresh, cwnd每次翻倍;
- 拥塞避免:cwnd == ssthresh, 每次cwnd和ssthresh都加1;
- 快重传和快恢复:如果不执行快重传和快恢复, 当发生超时,则cwnd = 1,ssthresh减半,从慢开始启动。 如果执行快重传和快恢复,则超时会收到三个重复确认,这时候ssthresh = ssthresh/2, cwnd = ssthresh,从拥塞避免开始。
- ARQ协议(自动重传请求协议):基本原理是发完分组后停止发送,等待对方确认后再发送下一组。包括停止等待ARQ和连续ARQ协议:
- 停止等待ARQ:发送一个分组后停止发送,等待对方确认,如果超时则重新发送。在发送过程中,发送方和接收方会丢弃重复的确认和分组。简单,但是信道利用率低
- 连续ARQ协议发送方维持一个发送窗口,可以将发送窗口内的分组全部发送出去,不需要等待确认,接收方累计确认,按照顺序为最后一个分组发送确认响应。信道利用率高,但是有回退N现象,比如发送5个分组,3丢失,4,5正常,则需要重新发送3即之后的分组。
- 超时重传:TCP发送一个段后,启动一个计时器,如果不能及时收到确认消息则重发这个报文段
9.打开输入网页url到显示的过程是什么?
- DNS解析:查找域名对应的IP地址(浏览器缓存、路由器缓存、DNS缓存);
- TCP三次握手建立连接;
- 发送HTTP请求:附带请求参数和cookies(辨别用户身份,存储在用户本地的数据);
- 服务器处理请求返回HTTP响应;
- 浏览器渲染HTML页面;
- TCP四次挥手释放连接;
10.Token、Cookies和Session的区别;HTTP不保存状态,如何保存用户状态?
Cookies和Session都是用来跟踪确认用户身份的一种会话方式;
- Cookies一般用来保存用户信息,应用在网页的自动登录上。Cookies存储在客户端(用户本地);
- 服务端通过Session来记录用户状态,比如添加商品到购物车时,HTTP协议是无状态的,系统不知道哪个用户操作的,服务端通过给用户创建一个特定的Session来标识跟踪用户。Session存储在服务端,安全性更高;
- Token(令牌)是用户身份的验证方式,最简单的token组成:uid(用户唯一的身份标识)、time(当前时间的时间戳)、sign(签名)、安全性最高。
HTTP是无状态协议,Session机制解决了保存用户状态的问题。服务端保存Session的方法有很多,常见的使用内存和数据库进行保存,如Redis。一般在Cookies中加入Session ID来进行跟踪,如果Cookies禁用,则可以在url中附加Session ID。
11.在网络7层协议模型中,http、tcp、ip分别属于哪一层?
HTTP:HTTP是一个基于TCP/IP通信协议来传递数据(HTML文件、图片文件、查询结果等),属于应用层; TCP:传输层 IP:网络层
12.谈一谈http各版本特性
-
HTTP/0.9
- 无状态型
每个HTTP请求都要经历一次DNS解析,三次握手、传输和四次挥手
- 不支持请求头
只支持纯文本内容
- 只有GET请求
- 无状态型
-
HTTP/1.0
- 持久连接
一次TCP连接,可服务多个HTTP请求
- 支持请求/响应头:
- 增加POST和HEADER请求
-
HTTP/1.1
- 默认持久连接,管道机制
一个TCP连接,允许多个请求同时发送,增加了并发性
- 支持分块传输,断点续传,缓存处理
- 增加PUT、PATCH、OPTIONS、DELETE请求
- 默认持久连接,管道机制
-
HTTP/2.0
- 多路复用
(二进制分帧)一个连接可以承载任意数量到双向数据流。每个数据流消息由一个或多个帧组成,帧可以乱序发送,然后再根据每个帧首部的流标识符重新组装
- 服务端推送
主动推送数据到客户端,类似长连接效果(长连接,客户端轮询)
- 头部压缩、随时复位、优先权等
13.谈一下https及加密过程;
HTTP Secure(超文本传输安全协议),是以安全为目标的HTTP通道,简单讲是HTTP的安全版。在HTTP基础上,增加TLS层(传输安全层),进行证书校验,密钥协商和数据加密。
- 加密过程:
- 客户端告诉服务端支持的HTTPS版本和支持的加密方式,生成随机数a给到服务端;
- 服务端传输一个HTTPS证书和随机数b到客户端;
- 客户端校验证书是否合法(经过权威认证的CA:Catificate Authority,它的作用就是提供证书(即服务器证书,由域名、公司信息、序列号和签名信息组成);
- 如果合法,客户端生成随机数c,使用服务端下发的证书进行公钥加密给到服务端;
- 根据约定的算法组成对称加密的密钥key,接下来的传输过程通过abc组成的密钥进行加密
a、b是明文,c是加密的,只有服务端和客户端能拿到c。公钥加密后只有服务端有私钥;
14.谈谈iOS网络编程的抓包工具;
- Charles
- 支持截取HTTP和HTTPS网络数据
- 支持移动端抓包
- 支持修改网络请求和响应参数
- 支持本地数据模拟服务端回包
- 支持模拟弱网络
15.HTTP长连接、短连接
HTTP的长短连接实际上就是TCP的长短连接。
TCP在进行读写之前,server与client之间必须提前建立一个连接。建立连接的过程,需要我们常说的三次握手,释放/关闭连接的话需要四次挥手。这个过程是比较消耗网络资源并且有时间延迟。
短连接说的就是服务端与客户端建立连接之后,读写完成之后就关闭掉连接,如果下一次再要互相发送消息,就要重新连接。HTTP1.0默认使用短连接。 长连接说的是客户端向服务端双方建立连接之后,即使clinent与server完成一次读写,它们之间的连接并不会主动关闭,后续的读写操作会继续使用这个连接。长连接可以省区较多的TCP建立和关闭的操作,节约时间。对于频繁请求资源的客户来说,非常使用长连接。HTTP1.1之后默认使用长连接。
16.讲一讲HTTP2.0和HTTP1.X的区别;HTTP如何在一个连接上建立多个请求?
HTTP 1.0一个连接一个请求,HTTP 1.1的长连接虽然可以串行化处理多个请求,但是会有线程阻塞,即前面的请求超时,后续的请求只能阻塞等待。
HTTP2.0引入了多路复用机制。即连接共享,一个request请求对应一个id,这样一个连接上可以有多个request,每个连接的request可以随机的混杂在一起,接收方可以根据request的 id将request再归属到各自不同的服务端请求里面。
17.URL和URI的区别
- URI(Uniform Resource Identifier)统一资源标志符,唯一标识一个资源。
- URL(Uniform Resource Location)统一资源定位符, 具体的URI,不仅可以标识资源还可以定位资源。
URL是URI的一个子集, URL是URI概念的一种实现方式。
18.HTTP报文是由哪几部分组成的?
HTTP报文分为请求报文和响应报文。 请求报文由下述结构组成:
- 请求行:包括请求方法、URL、协议/版本
- 请求头:一些信息
- 请求正文:传输的数据内容 响应报文由下述结构组成:
- 状态行:协议/版本、响应状态码
- 响应头:一些信息
- 响应正文:响应状态码和数据
19.HTTP和HTTPS的区别
- HTTP默认80端口,HTTPS默认443端口;
- HTTP传输内容是明文的,而HTTPS是经过加密的,所以更安全,但消耗更多资源。
20.讲一讲HTTP常见的状态码和对应的含义
| 2XX成功 | 3XX 重定向 | 4XX客户端错误 | 5XX服务端错误 |
|---|---|---|---|
| 200成功 | 400错误请求 | 500服务器错误 | |
| 201创建 | 301永久重定位 | 401未授权 | |
| 502网关错误 | |||
| 403禁止访问 | |||
| 304资源未修改 | 404未找到 | 504网关超时 | |
| 405请求方法不对 |
21.说一下URL地址每个部分代表的含义
url由三部分组成,协议名、主机名和路径及文件名 protocol :// hostname[:port] / path / [;parameters][?query]#fragment
- protocol(协议):指定使用的传输协议,最常用的是HTTP协议,它也是目前www中应用最广 但协议;
- hostname(主机名):是指存放资源的服务器的域名系统(DNS)主机名或IP地址;
- port(端口号):整数,可选,省略时使用方案的默认端口,各种传输协议都有默认的端口号,如http的默认端口为80。如果输入时省略,则使用默认端口;
- path(路径):由0个或多个"/"符号隔开的字符串,一般用来表示主机上的一个目录或文件地址;
- parameters(参数):这时用于指定特殊参数的可选项;
- ?query(查询):可选,用于指定特殊参数的可选项;
- fragment:信息片段,用于给动态网页(如使用CGI、ISAPI、PHP/ASP.NET等技术制作的网页)传递参数,可有多个参数,用“&”符号隔开的字符串,一般用来表示主机上的一个目录或文件地址。
22.介绍一下DNS协议;DNS查询,本地有存放域名和IP地址的映射吗,在哪里?DNS解析,递归和迭代的区别;
DNS 是一个分布式数据库,提供了主机名和 IP 地址之间相互转换的服务。这里的分布式数据库是指,每个站点只保留它自己的那部分数据。
域名具有层次结构,从上到下依次为:根域名、顶级域名、二级域名。
DNS 可以使用 UDP 或者 TCP 进行传输,使用的端口号都为 53。大多数情况下 DNS 使用 UDP 进行传输,这就要求域名解析器和域名服务器都必须自己处理超时和重传从而保证可靠性。在两种情况下会使用 TCP 进行传输:
- 如果返回的响应超过的 512 字节(UDP 最大只支持 512 字节的数据)。
- 区域传送(区域传送是主域名服务器向辅助域名服务器传送变化的那部分数据)