本篇涉及名词
包含HTTP TCP IP的一些面试题,解答可能不够详细和准确,如有错误,还望指出,仅供参考。
TCP、IP、HTTP、UDP的基本定义。
IP地址常识,有几类?
这里注意下,IP地址还分成广播地址,单播地址,多播地址。
TCP/IP的四层模型《图解TCP、ip第1章》
对比下OSI七层模型
来个终极boss
HTTP的报文结构?《图解HTTP第三章》
请求报文的格式:
响应报文的格式:
HTTP和HTTPs的区别?HTTPS是如何保证安全的?加密过程是怎样?《图解HTTP第七章》《HTTP权威指南第十四章》具体加密过程下次单独写。
TCP和UDP的区别?分别适用场景?《图解TCP、ip第6章》
UDP 在传送数据之前不需要先建立连接,远地主机在收到 UDP 报文后,不需要给出任何确认。虽然 UDP 不提供可靠交付,但在某些情况下 UDP 确是一种最有效的工作方式(一般用于即时通信),比如: QQ 语音、 QQ 视频 、直播等等
TCP 提供面向连接的服务。在传送数据之前必须先建立连接,数据传送结束后要释放连接。 TCP 不提供广播或多播服务。由于 TCP 要提供可靠的,面向连接的运输服务(TCP的可靠体现在TCP在传递数据之前,会有三次握手来建立连接,而且在数据传递时,有确认、窗口、重传、拥塞控制机制,在数据传完后,还会断开连接用来节约系统资源),这一难以避免增加了许多开销,如确认,流量控制,计时器以及连接管理等。这不仅使协议数据单元的首部增大很多,还要占用许多处理机资源。TCP 一般用于文件传输、发送和接收邮件、远程登录等场景。
Ping ICMP的报文是什么?《TCP、IP卷一第6章》
TCP的三次握手和四次握手?《TCP、IP卷一第18章》
建立一个连接需要三次握手,而终止一个连接需要经过四次握手,是由于TCP的半关闭造成的(TCP连接时全双工)。
简单示意图:
三次握手的目的是建立可靠的通信信道,说到通讯,简单来说就是数据的发送与接收,而三次握手最主要的目的就是双方确认自己与对方的发送与接收是正常的。
第一次握手:Client 什么都不能确认;Server 确认了对方发送正常
第二次握手:Client 确认了:自己发送、接收正常,对方发送、接收正常;Server 确认了:自己接收正常,对方发送正常
第三次握手:Client 确认了:自己发送、接收正常,对方发送、接收正常;Server 确认了:自己发送、接收正常,对方发送接收正常
所以三次握手就能确认双发收发功能都正常,缺一不可。
接收端传回发送端所发送的 SYN 是为了告诉发送端,我接收到的信息确实就是你所发送的信号了。
SYN 是 TCP/IP 建立连接时使用的握手信号。在客户机和服务器之间建立正常的 TCP 网络连接时,客户机首先发出一个 SYN 消息,服务器使用 SYN-ACK 应答表示接收到了这个消息,最后客户机再以 ACK(Acknowledgement[汉译:确认字符 ,在数据通信传输中,接收站发给发送站的一种传输控制字符。它表示确认发来的数据已经接受无误。 ])消息响应。这样在客户机和服务器之间才能建立起可靠的TCP连接,数据才可以在客户机和服务器之间传递。
双方通信无误必须是两者互相发送信息都无误。传了 SYN,证明发送方到接收方的通道没有问题,但是接收方到发送方的通道还需要 ACK 信号来进行验证。
断开一个 TCP 连接则需要“四次挥手”:
任何一方都可以在数据传送结束后发出连接释放的通知,待对方确认后进入半关闭状态。当另一方也没有数据再发送的时候,则发出连接释放通知,对方确认后就完全关闭了TCP连接。
举个例子:
A 和 B 打电话,通话即将结束后,
A 说“我没啥要说的了”,
B回答“我知道了”,但是 B 可能还会有要说的话,A 不能要求 B 跟着自己的节奏结束通话,于是 B 可能又巴拉巴拉说了一通,最后 B 说“我说完了”,
A 回答“知道了”,这样通话才算结束。
参考:https://blog.csdn.net/qzcsu/article/details/72861891
TCP拥塞控制《TCP、IP卷一第11、19、20、21、24、25、29章》(大致了解)
有了TCP的窗口控制,能够连续发生大量数据包,可能会因为其他主机之间的通信导致网络拥堵,在网络拥堵时,如果突然发送一个较大量的数据,极有可能会导致整个网络的瘫痪,TCP为了防止这个现象的出现,在通信一开始就会通过一个叫做慢启动的算法得出的数值,对发送数据量进行控制。
TCP的拥塞控制采用了四种算法,即 慢开始 、 拥塞避免 、快重传 和 快恢复。在网络层也可以使路由器采用适当的分组丢弃策略(如主动队列管理 AQM),以减少网络拥塞的发生。
TCP滑动窗口和回退N针协议《TCP、IP卷一第20章》《图解TCP、IP第六章》
TCP的传输方式有个缺点:包的往返时间越长通信性能越低,网络的吞吐量会越差。为了解决这个,TCP引入了窗口,及时往返时间较长,也能控制网络性能的下降。用滑动窗口方式并行处理,确认应答不是以个分段,而是以更大的单位进行确认,转发时间就被缩短了。这个机制实现使用了大量的缓冲区。
对比图如下:
有什么办法可保证UDP高可用性?
对高可用性不是很了解,资料看的头晕,等不晕了再看吧
https://blog.csdn.net/admin1973/article/details/71424160
TCP粘包如何解决?
https://www.cnblogs.com/crossoverJie/p/9446410.html
为什么需要心跳
什么是长连接?
在HTTP/1.0中默认使用短连接。也就是说,客户端和服务器每进行一次HTTP操作,就建立一次连接,任务结束就中断连接。当客户端浏览器访问的某个HTML或其他类型的Web页中包含有其他的Web资源(如JavaScript文件、图像文件、CSS文件等),每遇到这样一个Web资源,浏览器就会重新建立一个HTTP会话。
而从HTTP/1.1起,默认使用长连接,用以保持连接特性。使用长连接的HTTP协议,会在响应头加入这行代码:
Connection:keep-alive
在使用长连接的情况下,当一个网页打开完成后,客户端和服务器之间用于传输HTTP数据的TCP连接不会关闭,客户端再次访问这个服务器时,会继续使用这一条已经建立的连接。Keep-Alive不会永久保持连接,它有一个保持时间,可以在不同的服务器软件(如Apache)中设定这个时间。实现长连接需要客户端和服务端都支持长连接。
HTTP协议的长连接和短连接,实质上是TCP协议的长连接和短连接。
参考:https://www.cnblogs.com/gotodsp/p/6366163.html
用户在浏览器中输入网址并回车到看到的完整页面,中间经历了哪些?
用哪些属性可以唯一确定一条TCP连接?
TCP报头中的源端口号和目的端口号同IP数据报中的源IP与目的IP唯一确定一条TCP连接
序列号seq、确认号ack、确认ACK、同步SYN、终止FIN、SYN攻击
《TCP、IP卷二第24.7章》《TCP、IP卷一第18、20、24章》《TCP、IP卷二第24章》《TCP、IP卷一第18章》
在TCP中,当发送端的数据到达接收主机时,接收端主机会返回一个已收到消息的通知,这个消息就叫做确认应答(ACK)。确认应答处理、重发控制以及重复控制等功能都可以通过序列号实现,序列号是按顺序给发送数据的每一个字节(8位字节)都标上号码的编号,接收端查询接收数据TCP首部中的序列号和数据的长度,将自己下一步应该接收的序号作为确认应答返送回去。
参考资料:
《TCP/IP 详解卷1》
《图解TCP/IP》
《图解HTTP》
《HTTP权威指南》
https://github.com/ZoeSj/JavaGuide
http://www.cnblogs.com/GumpYan/p/5819933.html