一、网络协议模型
1、网络七层协议模型又叫OSI协议模型,自上而下分别为:7 应用层6 表示层 5 会话层4 传输层 3 网络层2 数据链路层 1 物理层。
- 物理层:主要定义物理设备的标准,如网线的类型、光纤的接口类型,从而达到传输比特流的目的,实现数模转换和模数转换(将二进制数据转换为电流强弱进行传输,到达目的地后再将电流强度转化为二进制数据)。
- 数据链路层:数据在物理层传输的时候可能会出现错传和数据传输不完整的情况,所以数据链路层用来定义如何格式化数据来进行传输,并提供错误检测和纠正的功能,以确保数据传输的可靠性。本层实现的主要功能是将比特流转化成帧。
- 网络层:网络节点之间的通信需要找到正确的目标节点和两个节点之间的最短路径。网络层的作用就是将网络地址翻译成对应的物理地址,并决定如何将数据从发送方路由到接收方。在此层传输的数据我们称之为数据包。本层需要关心的协议为TCP/IP协议里面的IP协议。
- 传输层:数据包在传输过程中,因为数据包较大,导致传输时间较长,而网络在通讯的过程中会中断好多次,为保证数据传输的准确性,需要对发出的数据进行切分,切割为一个一个的段落进行发送。段落丢失是否需要重传,段落是否需要按一定的顺序到达,是传输层需要做的事情。其主要原理是将发送方的数据进行强制切分并标号,发送给接受发后,接收方根据标号对数据进行正确的重组。本层是OSI模型的核心层,本层中需要关心的协议为TCP/IP协议中的TCP(传输控制协议)和UDP(用户数据协议)。
- 会话层:实现建立和管理应用程序之间的通信。说白了就是实现应用程序之间通信时能够自动收发包,自动找路由的功能。
- 表示层:帮我们解决不同系统之间相互通信的语法问题,在表示层,数据将按照网络能理解的方案进行格式化,如加密解密、转换翻译、压缩解压缩。
- 应用层:在解决语法问题之后,发送方也许知道自己发送的是什么、发送的数据有多长,但是接收方不知道,所以应用层的网络协议诞生了。它规定消息的发送方和接收方必须使用固定长度的消息头,消息头必须使用某种固定的组成,消息头里必须记录消息体的长度等一系列信息,一边接受方能够正确的解析发送方发送的数据。应用层旨在让你更方便的应用从网络中接受到的数据,至于数据如何传输,本层不关心。在应用层中,需要关心的协议为TCP/IP协议中的HTTP协议。
2、网络四层协议模型又叫TCP/IP协议模型,自上而下分别为:4 应用层 3 传输层2 网络层1 数据链路层。其实TCP/IP是OSI模型的实现。
OSI七层模型 | TCP/IP概念层模型 | 功能 | TCP/IP协议族 |
应用层 | 应用层 | 文件传输,电子邮件,文件服务、虚拟终端 | HTTP,TFTP, FTP, NFS, WAIS,SMTP |
表示层 | 数据格式化,代码转换,数据加密 | Telnet, Rlogin, SNMP, Gopher | |
会话层 | 接触或建立与别的接点的联系 | SMTP, DNS | |
传输层 | 传输层 | 提供端对端的接口 | TCP, UDP |
网络层 | 网络层 | 为数据包选择路由 | IP, ICMP, ARP, RARP, AKP, UUCP |
数据链路层 | 数据链路层 | 传输有地址的帧以及错误检测功能 | FDDI, Ethernet, Arpanet, PDN, SLIP, PPP |
物理层 | 以二进制数据形式在物理媒体上传输数据 | IEEE 802.1A, IEEE 802.2到IEEE 802.11 |
二、TCP协议
1、传输控制协议TCP简介
- 面向连接的、可靠的、基于字节流的传输层通信协议。
- 将应用层的数据流分割成报文段并发送给目标节点的TCP层。
- 数据包都有序号seq,对方收到则发送ACK确认,未收到则重传。
- 使用校验和来校验数据在传输过程中是否有误。
2、TCP三次握手过程
握手是为了建立连接,TCP三次握手的流程如下:
位码即tcp标志位,有6种标示:SYN(synchronous建立联机) ACK(acknowledgement 确认) PSH(push传送) FIN(finish结束) RST(reset重置) URG(urgent紧急)Sequence number(顺序号码) Acknowledge number(确认号码)
- 第一次握手:主机A发送位码为syn=1,随机产生seq number=x的数据包到服务器,并进入SYN_SEND状态,等待主机B确认,主机B由SYN=1知道,A要求建立联机;
- 第二次握手:主机B收到请求后要确认联机信息,向A发送ack number=(主机A的seq number+1),syn=1,ack=1,随机产生seq number=y的包,此时主机B进入SYN_RECV状态
- 第三次握手:主机A收到后检查ack number是否正确,即第一次发送的seq number+1,以及位码ack是否为1,若正确,主机A会再发送ack number=(主机B的eq number+1),ack=1,主机B收到后确认eq number的值与ack=1则连接建立成功,此时主机A和主机B进入ESTABLISHED状态。
实例:
IP 192.168.1.116.3337 > 192.168.1.123.7788: S 3626544836:3626544836
IP 192.168.1.123.7788 > 192.168.1.116.3337: S 1739326486:1739326486 ack 3626544837
IP 192.168.1.116.3337 > 192.168.1.123.7788: ack 1739326487,ack 1
第一次握手:192.168.1.116发送位码syn=1,随机产生seq number=3626544836的数据包到192.168.1.123,192.168.1.123由SYN=1知道192.168.1.116要求建立联机;
第二次握手:192.168.1.123收到请求后要确认联机信息,向192.168.1.116发送ack number=3626544837,syn=1,ack=1,随机产生seq=1739326486的包;
第三次握手:192.168.1.116收到后检查ack number是否正确,即第一次发送的seq number+1,以及位码ack是否为1,若正确,192.168.1.116会再发送ack number=1739326487,ack=1,192.168.1.123收到后确认seq=seq+1,ack=1则连接建立成功。
3、TCP的四次挥手过程
- 第一次挥手:客户端进程发出连接释放报文,并且停止发送数据。释放数据报文首部,FIN=1,其序列号为seq=u,此时,客户端进入FIN-WAIT-1(终止等待1)状态。
- 第二次挥手:服务器收到连接释放报文,发出确认报文,ACK=1,ack=u+1,并且带上自己的序列号seq=v,此时,服务端就进入了CLOSE-WAIT(关闭等待)状态。TCP服务器通知高层的应用进程,客户端向服务器的方向就释放了,这时候处于半关闭状态,即客户端已经没有数据要发送了,但是服务器若发送数据,客户端依然要接受。这个状态还要持续一段时间,也就是整个CLOSE-WAIT状态持续的时间。客户端收到服务器的确认请求后,此时,客户端就进入FIN-WAIT-2(终止等待2)状态,等待服务器发送连接释放报文(在这之前还需要接受服务器发送的最后的数据)。
- 第三次挥手:服务器将最后的数据发送完毕后,就向客户端发送连接释放报文,FIN=1,ack=u+1,由于在半关闭状态,服务器很可能又发送了一些数据,假定此时的序列号为seq=w,此时,服务器就进入了LAST-ACK(最后确认)状态,等待客户端的确认。
- 第四次挥手:客户端收到服务器的连接释放报文后,必须发出确认,ACK=1,ack=w+1,而自己的序列号是seq=u+1,此时,客户端就进入了TIME-WAIT(时间等待)状态。注意此时TCP连接还没有释放,必须经过2MSL(最长报文段寿命)的时间后,当客户端撤销相应的TCB后,才进入CLOSED状态。服务器只要收到了客户端发出的确认,立即进入CLOSED状态。同样,撤销TCB后,就结束了这次的TCP连接。可以看到,服务器结束TCP连接的时间要比客户端早一些。
4、关于TCP的常见面试题
【问题1】为什么连接的时候是三次握手,关闭的时候却是四次握手?
答:因为当Server端收到Client端的SYN连接请求报文后,可以直接发送SYN+ACK报文。其中ACK报文是用来应答的,SYN报文是用来同步的。但是关闭连接时,当Server端收到FIN报文时,很可能并不会立即关闭SOCKET,所以只能先回复一个ACK报文,告诉Client端,"你发的FIN报文我收到了"。只有等到我Server端所有的报文都发送完了,我才能发送FIN报文,因此不能一起发送。故需要四步握手。
【问题2】为什么TIME_WAIT状态需要经过2MSL(最大报文段生存时间)才能返回到CLOSE状态?
答:虽然按道理,四个报文都发送完毕,我们可以直接进入CLOSE状态了,但是我们必须假象网络是不可靠的,有可以最后一个ACK丢失。所以TIME_WAIT状态就是用来重发可能丢失的ACK报文。在Client发送出最后的ACK回复,但该ACK可能丢失。Server如果没有收到ACK,将不断重复发送FIN片段。所以Client不能立即关闭,它必须确认Server接收到了该ACK。Client会在发送出ACK之后进入到TIME_WAIT状态。Client会设置一个计时器,等待2MSL的时间。如果在该时间内再次收到FIN,那么Client会重发ACK并再次等待2MSL。所谓的2MSL是两倍的MSL(Maximum Segment Lifetime)。MSL指一个片段在网络中最大的存活时间,2MSL就是一个发送和一个回复所需的最大时间。如果直到2MSL,Client都没有再次收到FIN,那么Client推断ACK已经被成功接收,则结束TCP连接。
【问题3】为什么不能用两次握手进行连接?
答:3次握手完成两个重要的功能,既要双方做好发送数据的准备工作(双方都知道彼此已准备好),也要允许双方就初始序列号进行协商,这个序列号在握手过程中被发送和确认。
现在把三次握手改成仅需要两次握手,死锁是可能发生的。作为例子,考虑计算机S和C之间的通信,假定C给S发送一个连接请求分组,S收到了这个分组,并发 送了确认应答分组。按照两次握手的协定,S认为连接已经成功地建立了,可以开始发送数据分组。可是,C在S的应答分组在传输中被丢失的情况下,将不知道S 是否已准备好,不知道S建立什么样的序列号,C甚至怀疑S是否收到自己的连接请求分组。在这种情况下,C认为连接还未建立成功,将忽略S发来的任何数据分 组,只等待连接确认应答分组。而S在发出的分组超时后,重复发送同样的分组。这样就形成了死锁。
【问题4】如果已经建立了连接,但是客户端突然出现故障了怎么办?
TCP还设有一个保活计时器,显然,客户端如果出现故障,服务器不能一直等下去,白白浪费资源。服务器每收到一次客户端的请求后都会重新复位这个计时器,时间通常是设置为2小时,若两小时还没有收到客户端的任何数据,服务器就会发送一个探测报文段,以后每隔75分钟发送一次。若一连发送10个探测报文仍然没反应,服务器就认为客户端出了故障,接着就关闭连接。
5、TCP和UDP的区别
UDP不提供复杂的控制机制,利用IP提供面向无连接的通信服务。并且它是将应用程序发来的数据在收到的那一刻,立刻按照原样发送到网络上的一种机制。 即使是出现网络拥堵的情况下,UDP也无法进行流量控制等避免网络拥塞的行为。此外,传输途中如果出现了丢包,UDO也不负责重发,甚至当出现包的到达顺序乱掉时也没有纠正的功能。UDP传输速度较快。
TCP是面向连接的协议,在收发数据前,双方必须建立可靠的连接。在数据传递时,有确认、窗口、重传、拥塞控制机制。TCP保证数据正确性,保证数据顺序,不会发生丢包的现象。TCP传输速度较慢。
6、TCP的滑动窗口
先理解什么是RTT和RTO
- RTT:发送一个数据包到收到对应的ACK,所花费的时间间隔。
- RTO:如果在一定时间内未收到接受数据包的确认信息,会重穿数据包,重传时间间隔就是RTO。
TCP使用滑动窗口做流量控制与乱序重排
7、HTTP的请求/响应步骤
- 客户端连接到Web服务器。
- 发送HTTP请求。
- 服务器接受请求并返回HTTP响应
- 释放TCP连接
- 客户端浏览器解析HTML内容
8、在浏览器地址栏键入URL,按下回车之后经历的流程
- 通过访问的域名找出其IP地址
- 根据IP地址和对应端口,和服务器建立TCP连接
- 浏览器发送读取文件的HTTP请求
- 服务器处理请求并返回HTTP报文
- 浏览器解析渲染页面
- 浏览器释放TCP连接,连接结束
9、常见HTTP状态码
- 1xx:指示信息 —— 表示请求已接收,继续处理。
- 2xx:成功 —— 表示请求已被成功接收、理解、接受。
- 3xx:重定向 —— 要完成请求必须进行更进一步的操作。
- 4xx:客户端错误 —— 请求有语法错误或请求无法实现。
- 5xx:服务器端错误 —— 服务器未能实现合法的请求。
示例:
- 200 OK:客户端请求成功。
- 400 Bad Request:客户端请求有语法错误,不能被服务器所理解。
- 401 Unauthorized:请求未经授权,这个状态代码必须和 WWW-Authenticate 报头域一起使用。
- 403 Forbidden:服务器收到请求,但是拒绝提供服务。
- 404 Not Found:请求资源不存在,举个例子:输入了错误的URL。
- 500 Internal Server Error:服务器发生不可预期的错误。
- 503 Server Unavailable:服务器当前不能处理客户端的请求,一段时间后可能恢复正常。
10、GET请求和POST请求的区别
从三个层面解答
- Http报文层面:GET将请求信息放在URL中,POST放在报文体中
- 数据库层面:GET符合幂等性(对数据库的一次操作或者多次操作获得的结果是一致的)和安全性(对数据库的操作没有改变数据库中的数据),POST不符合
- 其他层面:GET可以被缓存、被存储,而POST不行
11、Cookie和Session
Cookie简介
- 是由服务器发给客户端的特殊信息,以文本的形式存放在客户端
- 客户端再次请求的时候,会把Cookie回发
- 服务器接收到后,会解析Cookie生成与客户端相对应的内容
Session简介
- 服务器端的机制,在服务器上保存的信息
- 解析客户端请求并操作session id,按需保存状态信息
Cookie和Session的区别
- Cookie的数据存放在客户的浏览器上,Session的数据放在服务器上
- Session相对于Cookie更加安全
- Session会在一定时间内保存在服务器上。当访问增多,会比较占用你服务器的性能,考虑到减轻服务器性能方面,应当使用Cookie。
12、HTTP(超文本传输协议)和HTTPS(超文本传输安全协议)
SSL(安全套接层)
- 为网络通信提供安全及数据完整性的一种安全协议
- 是操作系统对外的API,SSL3.0后更名为TLS
- 采用身份验证和数据加密保证网络通信的安全和数据的完整性
HTTPS数据传输流程
- 浏览器将支持的加密算法信息发送给服务器
- 服务器选择一套浏览器支持的加密算法,以证书的形式回发给浏览器
- 浏览器验证证书合法性,并结合证书公钥加密信息发送给服务器
- 服务器使用私钥解密密码,验证哈希值,加密响应信息回发给浏览器
- 浏览器解密响应信息,并对信息进行验证,之后进行加密交互数据
HTTP和HTTPS的区别
- HTTPS需要到CA申请证书,HTTP不需要
- HTTPS密文传输,HTTP明文传输
- 连接方式不同,HTTPS默认使用443端口,HTTP默认使用80端口
- HTTPS=HTTP+加密+认证+完整性保护,较HTTP更加安全
13、Socket通信流程
- 服务器先创建socket,再为socket绑定IP地址和端口号,服务器的socket就会监听此端口号的请求,随时准备接受客户端发来的连接,此时处于listen的状态。
- 客户端开始创建socket,并根据服务器的IP地址和端口号尝试去连接服务器的scoket,服务器的socket接受到客户端的scoket的请求后被动打开,并开始接受客户端的请求直到客户端返回连接信息,此时服务器进入accpet方法。
- 客户端在连接成功后,就会向服务器发送连接状态信息,服务器在接收到客户端的连接信息之后就会将accept方法返回,并提示连接成功,此时客户端就可以向socket写入信息,服务器也可以从socket中收到和读取相关信息。
- 最后客户端关闭socket,服务端也随之关闭socket