1、OSI七层协议
- 应用层(数据,应用协议数据单元APDU):确定进程之间通信的性质以满足用户需要以及提供网络与用户应用(FTP、DNS、Telnet、SMTP、HTTP、WWW、NFS)
- 表示层(数据,表示协议数据单元PPDU):主要解决拥护信息的语法表示问题,对数据进行加密解密、翻译、压缩(JPEG、MPEG、ASII)
- 会话层(数据,会话协议数据单元SPDU):建立、管理和终止会话——提供包括访问验证和会话管理在内的建立和维护应用之间通信的机制,如服务器验证用户登录便是由会话层完成的(NFS、SQL、NETBIOS、RPC)
- 传输层(段,Segment):实现网络不同主机上用户进程之间的数据通信,即端到端的可靠与不可靠的传输,传输层的错误检测,错误恢复,流量控制等(TCP、UDP、SPX)
- 网络层(包,PackeT):提供逻辑地址(IP)、选路,数据从源端到目的端的网际互连和传输(IP、ICMP、ARP、RARP、OSPF、IPX、RIP、IGRP、 (路由器))
- 数据链路层(帧,Frame):将上层数据封装成帧,用 MAC 地址访问媒介,错误检测与修正,点对点的传递(PPP、FR、HDLC、VLAN、MAC (网桥,交换机))
- 物理层(比特流,Bit):设备之间比特流的传输,物理接口,电气规范等 (RJ45,CLOCK、IEEE802.3 (中继器,集线器,网关))
2、http协议的特点
- 支持客户端/服务器模式
- 简单快速
- 灵活
- 无连接
- 无状态
3、如何理解IP协议的不可靠和无连接
不可靠:指的是不能保证数据报能成功地到达目的地。 发生错误时候,丢弃该数据包,发送ICMP消息给信源端。 可靠性由上层提供。
无连接:IP不维护关于后续数据报的状态信息。 体现在,IP数据可以不按顺序发送和接收。A发送连续的数据报,到达B 不一定是连续的, 来回路由选择可能不一样,路线也不一样,到达先后顺序也不一样。
4、IP地址的分类
A类地址:以0开头, 第一个字节范围:0~127(1.0.0.0 - 126.255.255.255);
B类地址:以10开头,第一个字节范围:128~191(128.0.0.0 - 191.255.255.255);
C类地址:以110开头,第一个字节范围:192~223(192.0.0.0 - 223.255.255.255);
10.0.0.0—10.255.255.255,172.16.0.0—172.31.255.255, 192.168.0.0—192.168.255.255。(Internet上保留地址用于内部)
IP地址与子网掩码相与得到主机号
UDP和TCP的简单介绍
UDP是一个简单的面向数据报的运输层协议:进程的每个输出操作都正好产生一个UDP数 据报,并组装成一份待发送的IP 数据报。
TCP是面向流字符,应用程序产生的全体数据与真正发送的单个IP 数据报可能没什么联系。
TCP通过哪些方式来保证可靠性
1) 应用数据被分割成TCP认为最适合发送的数据块。
2) 确认机制,发送报文后,等待确认。
3) 超时重传,没有收到确认,将重发数据段。
4) 保持它首部和数据的校验和。确认数据的准确性。
5) 排序,丢弃重复的,流量控制。
TCP与UDP的概念相互的区别与优劣
- TCP面向连接,UDP无连接
- TCP面向字节流,UDP面向数据报
- TCP提供可靠传输服务(数据顺序、正确性),UDP尽最大努力交付,不可靠
- TCP协议传输速度慢,UDP协议传输速度快
- TCP协议对系统资源要求多(头部开销大),UDP协议要求少
- TCP适用于对效率要求相对较低,但对准确性要求相对较高的,或者是有连接的场景。UDP适用于对效率要求较高,对准确性要求相对较低的场景。
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,至此,完成四次挥手。
为何三次握手?两次不行吗?
三次握手的过程即是通信双方相互告知序列号起始值, 并确认对方已经收到了序列号起始值的必经步骤,如果只是两次握手, 至多只有连接发起方的起始序列号能被确认, 另一方选择的序列号则得不到确认。同时,三次握手还可以避免两次握手情况下会出现的资源浪费(已过期的连接请求报文突然又传送到服务器,因而产生错误)。
为什么要设置TIME_WAIT?为什么TIME_WAIT是两倍的MSL(IP数据报能够在因特网上存活的最长时间)?如果有大量time_wait会发生什么,该怎么解决?
- 1)为实现TCP的可靠释放。2)为使旧的数据包在网络因过期而消失。
- 因为如果第四次挥手主动方(先请求释放连接的一方)发送的确认在网络中丢失了,那么在两倍MSL时间内能够收到被动方(后请求释放连接的一方)重新发送的释放连接请求。由于被动方超时重发之前需要一倍MSL,发送后最多需要一倍MSL到达主动方。
- 当请求量比较大的时候,而且所有的请求都是短连接,就会产生大量的time_wait。如果有大量time_wait会使得资源(客户端IP地址和端口)被浪费。
服务器可以设置SO_REUSEADDR套接字选项来通知内核,如果端口忙,但TCP连接位于TIME_WAIT状态时可以重用端口。在一个非常有用的场景就是,如果你的服务器程序停止后想立即重启,而新的套接字依旧希望使用同一端口,此时SO_REUSEADDR选项就可以避免TIME_WAIT状态。
什么是半连接状态?
三次握手中,主动发起握手的一方不发最后一次ACK,使得服务器端阻塞在SYN_RECV状态。
什么是SYN攻击?
半连接攻击(SYN攻击):会耗尽服务器资源,使得真正的请求无法建立连接。
各种协议
ICMP协议: 因特网控制报文协议。它是TCP/IP协议族的一个子协议,用于在IP主机、路由器之间传递控制消息。
TFTP协议: 是TCP/IP协议族中的一个用来在客户机与服务器之间进行简单文件传输的协议,提供不复杂、开销不大的文件传输服务。
HTTP协议: 超文本传输协议,是一个属于应用层的面向对象的协议,由于其简捷、快速的方式,适用于分布式超媒体信息系统。
DHCP协议: 动态主机配置协议,是一种让系统得以连接到网络上,并获取所需要的配置参数手段。
NAT协议:网络地址转换属接入广域网(WAN)技术,是一种将私有(保留)地址转化为合法IP地址的转换技术,
DHCP协议:一个局域网的网络协议,使用UDP协议工作,用途:给内部网络或网络服务供应商自动分配IP地址,给用户或者内部网络管理员作为对所有计算机作中央管理的手段。
DNS的概念,用途
域名解析,将域名转换成 ip地址,能够使用户更方便的访问互联网,而不用去记住能够被机器直接读取的 ip 地址
DNS的查询方式
- 递归查询:客户机向dns服务器发送请求,DNS服务器会使用一个准确的查询结果回复给客户机,如果DNS服务器本地没有储存查询的DNS信息,那么它会查询其他的DNS服务器,并将查询结果提交给客户机。
- 迭代查询:客户机向dns服务器发送请求,如果该服务器本地没有储存查询的DNS信息,那么它会告诉客户机另一台DNS服务器的地址,客户机在向这台DNS服务器查询DNS信息,依次循环直到返回结果。
GET和POST的区别
在客户机和服务器之间进行请求-响应时,两种最常被用到的方法是:GET 和 POST。GET:从指定的资源请求数据。POST:向指定的资源提交要被处理的数据。
1.GET是从服务器上获取数据,POST是向服务器传送数据。
2.数据位置:GET在HTTP包头,POST在HTTP正文。
3.GET能被缓存,POST不能被缓存。
4.GET传送的数据量较小,不能大于2KB。POST支持传送的数据量较大。
5.GET明文传输安全性非常低,POST可以密文传输安全性较高。
简单来说:GET产生一个TCP数据包,POST产生两个TCP数据包
严格的说:对于GET方式的请求,游览器会把http header和data一并发送出去,服务器响应200(返回数据);
而对于POST请求。游览器先发送header,服务器响应100 continue,游览器再发送data,服务器响应200 ok(返回数据)
注:千万别说什么POST比GET安全什么的。这样一下子面试官就知道你的底子了。
Http和Https的区别
http的连接很简单,是无状态的。Https协议是由Http+SSL构建的可进行加密传输、身份认证的网络协议,比http协议安全。
http的信息是明文传输,https是具有安全性的ssl加密传输协议。
https需要到证书颁发机构申请证书,而http不用。
http默认80端口,https默认443端口。
https如何实现加密传输
使用SSL/TLS协议进行加密传输,让客户端拿到服务器的公钥,然后客户端随机生成一个对称加密的秘钥,使用公钥加密,传输给服务端,后续的所有信息都通过该对称秘钥进行加密解密,完成整个HTTPS的流程。
http无状态怎么实现用户登录
通过cookie和session。
cookies机制和session机制的区别
1)cookies数据存放在客户端,session数据放在服务器上。
2)cookies不是很安全,别人可以分析存放在本地的cookie并进行cookie欺骗,考虑到安全应当使用session。
3)session会在一定时间内保存在服务器上,当访问增多,会比较占用你服务器的性能,考虑性能应当使用cookies。
4)不同浏览器对cookie的数据大小限制不同,个数限制也不相同。
5)可以考虑将登陆信息等重要信息存放为session,不重要的信息可以放在cookies中。
说一下一次完整的http请求
- 浏览器中输入url,先解析url是否合法
- 浏览器检查是否有缓存(浏览器缓存-系统缓存-路由器缓存),有则直接显示,没有继续下一步
- DNS域名解析,得到对应的IP地址
- 根据这个IP地址找到对应服务器
- TCP三次握手建立连接
- 发起HTTP请求,请求数据包等信息
- 服务器响应HTTP请求,返回数据
- 浏览器收到服务器的响应,得到html代码
- 浏览器解析html代码的资源,如果响应可以缓存,也会存入缓存
- 浏览器对页面进行渲染呈现给用户
- 释放TCP连接
http连接之后服务机内部都会干什么事?
(1 建立连接——接受一个客户端连接, 或者如果不希望与这个客户端建立连接, 就将其关闭。
(2 接收请求——从网络中读取一条 HTTP 请求报文。
(3 处理请求——对请求报文进行解释, 并采取行动。
(4 访问资源——访问报文中指定的资源。
(5 构建响应——创建带有正确首部的 HTTP 响应报文。
(6 发送响应——将响应回送给客户端。
(7 记录事务处理过程——将与已完成事务有关的内容记录在一个日志文件中。
HTTP状态码
- 1XX:通知。
- 2XX:成功。200(“OK”):一切正常。
- 3XX:重定向。301(“Moved Permanently”):当客户端触发的动作引起了资源URI的变化时发送此响应代码。
302:重定向 - 4XX:客户端错误。
400(“Bad Request”):客户端方面的问题,请求没有进入到后台服务里(一般都是前端的锅)。
404(“Not Found”) :服务器端不知道客户端要请求哪个资源。
409(“Conflict”):当客户端试图执行一个”会导致一个或多个资源处于不一致状态“的操作时,发送此响应代码。
410(“Gone”):服务器端知道客户端所请求的资源曾经存在,但现在已经不存在了。 - 5XX:服务端错误。
500(“Internal Sever Error”):服务器方面的问题。
502:无效的响应(基本上就是Tomcat没启好)
TCP流量控制和拥塞控制的区别?
- 流量控制是为了解决发送方和接收方速度不同导致的数据丢失问题,当发送方发送的太快,接收方来不及接受就会导致数据丢失,是点对点通信量的控制。流量控制用滑动窗口的形式解决问题。
- 拥塞控制就是防止过多的数据注入到网络中,这样可以使网络中的路由器或链路不至于过载。拥塞控制所要做的都有一个前提,就是网络能承受现有的网络负荷。拥塞问题是一个全局性的问题,涉及到所有的主机、所有的路由器、以及与降低网络传输性能有关的所有因素。通过维护一个拥塞窗口的状态变量,拥塞窗口的大小取决于网络的拥塞程度。注意考虑到接受方的接收能力,发送窗口可能小于拥塞窗口,两者并不等价。
Socket是什么
套接字(socket)是一个抽象层,应用程序可以通过它发送或接收数据,可对其进行像对文件一样的打开、读写和关闭等操作。套接字允许应用程序将I/O插入到网络中,并与网络中的其他应用程序进行通信。网络套接字是IP地址与端口的组合。建立网络通信连接至少要一对端口号(socket)。socket本质是API,对TCP/IP的封装。
TCP粘包,拆包
TCP是以流动的方式传输数据,传输的最小单位为一个报文段。也就是说发送端发送的消息如果太长了就会被切割成若干个报文段,然后以报文段的形式发送,同时如果消息比较短那么发送方就会先将消息缓存在缓冲区,直到达到可以发送的长度之后再发送。那么如果发送方发送的两条完整的消息在一个数据包中,被接收方接收之后没办法知道第一条消息从哪里结束,这种情况就叫做TCP粘包。同样,如果第一条消息只有一部分在第一个数据包中,剩下的部分在第二个数据包中,那么这种情况就叫做TCP拆包。
TCP粘包,拆包的解决办法
1)使用带消息头的协议、消息头存储消息开始标识及消息长度信息,服务端获取消息头的时候解析出消息长度,然后向后读取该长度的内容。
2)设置定长消息,服务端每次读取既定长度的内容作为一条完整消息。
3)设置消息边界,服务端从网络流中按消息编辑分离出消息内容。
什么叫字节流,什么叫数据报?
字节流就是散乱的一堆数据,接收方每次取多少由自己决定,而数据报指的是发送方发送多少接收方就要原封不动地接收多少。