常见网络编程面试题
点击“程序员面试吧”,选择“星标🔝”
点击文末“阅读原文”解锁资料!
简化问题难度和复杂度。由于各层之间独立,我们可以分割大问题为小问题。
灵活性好。当其中一层的技术变化时,只要层间接口关系保持不变,其他层不受影响。
易于实现和维护。
促进标准化工作。分开后,每层功能可以相对简单地被描述。
TCP/IP是一个四层的体系结构,主要包括:应用层、运输层、网际层和网络接口层。
五层协议的体系结构主要包括:应用层、运输层、网络层,数据链路层和物理层。
OSI七层协议模型主要包括是:应用层(Application)、表示层(Presentation)、会话层(Session)、运输层(Transport)、网络层(Network)、数据链路层(Data Link)、物理层(Physical)。
传输控制协议-TCP:提供面向连接的,可靠的数据传输服务。
用户数据协议-UDP:提供无连接的,尽最大努力的数据传输服务(不保证数据传输的可靠性)。
UDP | TCP | |
是否连接 | 无连接 | 面向连接 |
是否可靠 | 不可靠传输,不使用流量控制和拥塞控制 | 可靠传输,使用流量控制和拥塞控制 |
连接对象个数 | 支持一对一,一对多,多对一和多对多交互通信 | 只能是一对一通信 |
传输方式 | 面向报文 | 面向字节流 |
首部开销 | 首部开销小,仅8字节 | 首部最小20字节,最大60字节 |
场景 | 适用于实时应用(IP电话、视频会议、直播等) | 适用于要求可靠传输的应用,例如文件传输 |
HTTP(Hypertext Transfer Protocol,超文本传输协议),主要用于普通浏览。
HTTPS(HTTP over SSL,安全超文本传输协议),HTTP 协议的安全版本。
FTP(File Transfer Protocol,文件传输协议),用于文件传输。
POP3(Post Office Protocol,version 3,邮局协议),收邮件用。
SMTP(Simple Mail Transfer Protocol,简单邮件传输协议),用来发送电子邮件。
TELNET(Teletype over the Network,网络电传),通过一个终端(terminal)登陆到网络。
SSH(Secure Shell,用于替代安全性差的 TELNET),用于加密安全登陆用。
BOOTP(Boot Protocol,启动协议),应用于无盘设备。
NTP(Network Time Protocol,网络时间协议),用于网络同步。
DHCP(Dynamic Host Configuration Protocol,动态主机配置协议),动态配置IP地址。
DNS(Domain Name Service,域名服务),用于完成地址查找,邮件转发等工作。
序号:seq 序号,占 32 位,用来标识从 TCP 源端向目的端发送的字节流,发起方发送数据时对此进行标记。
确认序号:ACK 序号,占 32 位,只有 ACK 标志位为1时,确认序号字段才有效,ack=seq+1。
标志位:共 6 个,即 URG、ACK、PSH、RST、SYN、FIN 等,具体含义如下:
ACK:确认序号有效。
FIN:释放一个连接。
PSH:接收方应该尽快将这个报文交给应用层。
RST:重置连接。
SYN:发起一个新连接。
URG:紧急指针(urgent pointer)有效。
不要将确认序号 ACK 与标志位中的 ACK 搞混了。
确认方 ack = 发起方 seq + 1,两端配对。
第一次握手:客户端要向服务端发起连接请求,首先客户端随机生成一个起始序列号 ISN(比如是 100),那客户端向服务端发送的报文段包含 SYN 标志位(也就是 SYN = 1),序列号 seq = 100。
第二次握手:服务端收到客户端发过来的报文后,发现 SYN = 1,知道这是一个连接请求,于是将客户端的起始序列号 100 存起来,并且随机生成一个服务端的起始序列号(比如是 300)。然后给客户端回复一段报文,回复报文包含 SYN 和 ACK 标志(也就是 SYN = 1,ACK = 1)、序列号 seq = 300、确认号 ack = 101(客户端发过来的序列号 + 1)。
第三次握手:客户端收到服务端的回复后发现 ACK = 1并且 ack =101,于是知道服务端已经收到了序列号为 100 的那段报文;同时发现 SYN = 1,知道了服务端同意了这次连接,于是就将服务端的序列号 300 给存下来。然后客户端再回复一段报文给服务端,报文包含 ACK 标志位(ACK = 1)、ack = 301(服务端序列号+1)、seq = 101(第一次握手时发送报文是占据一个序列号的,所以这次 seq 就从 101 开始,需要注意的是不携带数据的 ACK 报文是不占据序列号的,所以后面第一次正式发送数据时 seq 还是 101)。当服务端收到报文后发现 ACK = 1 并且 ack = 301,就知道客户端收到序列号为 300 的报文了,就这样客户端和服务端通过 TCP 建立了连接。
第一次挥手:当客户端的数据都传输完成后,客户端向服务端发出连接释放报文(当然数据没发完时也可以发送连接释放报文并停止发送数据),释放连接报文包含 FIN 标志位(FIN = 1)、序列号 seq = 1101(100 + 1 + 1000,其中的 1 是建立连接时占的一个序列号)。需要注意的是客户端发出 FIN 报文段后只是不能发数据了,但是还可以正常收数据;另外FIN报文段即使不携带数据也要占据一个序列号。
第二次挥手:服务端收到客户端发的FIN报文后给客户端回复确认报文,确认报文包含 ACK 标志位(ACK = 1)、确认号 ack = 1102(客户端 FIN 报文序列号 1101 + 1)、序列号 seq = 2300(300 + 2000)。此时服务端处于关闭等待状态,而不是立马给客户端发 FIN 报文,这个状态还要持续一段时间,因为服务端可能还有数据没发完。
第三次挥手:服务端将最后数据(比如 50 个字节)发送完毕后就向客户端发出连接释放报文,报文包含 FIN 和 ACK 标志位(FIN = 1,ACK = 1)、确认号和第二次挥手一样 ack = 1102、序列号 seq = 2350(2300 + 50)。
第四次挥手:客户端收到服务端发的FIN报文后,向服务端发出确认报文,确认报文包含 ACK 标志位(ACK = 1)、确认号 ack = 2351、序列号 seq = 1102。注意客户端发出确认报文后不是立马释放 TCP 连接,而是要经过 2MSL(最长报文段寿命的 2 倍时长)后才释放 TCP 连接。而服务端一旦收到客户端发出的确认报文就会立马释放 TCP 连接,所以服务端结束 TCP 连接的时间要比客户端早一些。
区别 | HTTP | HTTPS |
协议 | 运行在 TCP 之上,明文传输,客户端与服务器端都无法验证对方的身份 | 身披 SSL( Secure Socket Layer )外壳的 HTTP,运行于 SSL 上,SSL 运行于 TCP 之上, 是添加了加密和认证机制的 HTTP。 |
端口 | 80 | 443 |
资源消耗 | 较少 | 由于加解密处理,会消耗更多的 CPU 和内存资源 |
开销 | 无需证书 | 需要证书,而证书一般需要向认证机构购买 |
加密机制 | 无 | 共享密钥加密和公开密钥加密并用的混合加密机制 |
安全性 | 弱 | 由于加密机制,安全性强 |
类别 | 原因短语 |
1XX | Informational(信息性状态码) 接受的请求正在处理 |
2XX | Success(成功状态码) 请求正常处理完毕 |
3XX | Redirection(重定向状态码) 需要进行附加操作以完成请求 |
4XX | Client Error(客户端错误状态码) 服务器无法处理请求 |
5XX | Server Error(服务器错误状态码) 服务器处理请求出错 |
2XX | 成功(这系列表明请求被正常处理了) |
200 | OK,表示从客户端发来的请求在服务器端被正确处理 |
204 | No content,表示请求成功,但响应报文不含实体的主体部分 |
206 | Partial Content,进行范围请求成功 |
3XX | 重定向(表明浏览器要执行特殊处理) |
301 | moved permanently,永久性重定向,表示资源已被分配了新的 URL |
302 | found,临时性重定向,表示资源临时被分配了新的 URL |
303 | see other,表示资源存在着另一个 URL,应使用 GET 方法获取资源(对于301/302/303响应,几乎所有浏览器都会删除报文主体并自动用GET重新请求) |
304 | not modified,表示服务器允许访问资源,但请求未满足条件的情况(与重定向无关) |
307 | temporary redirect,临时重定向,和302含义类似,但是期望客户端保持请求方法不变向新的地址发出请求 |
4XX | 客户端错误 |
400 | bad request,请求报文存在语法错误 |
401 | unauthorized,表示发送的请求需要有通过 HTTP 认证的认证信息 |
403 | forbidden,表示对请求资源的访问被服务器拒绝,可在实体主体部分返回原因描述 |
404 | not found,表示在服务器上没有找到请求的资源 |
5XX | 服务器错误 |
500 | internal sever error,表示服务器端在执行请求时发生了错误 |
501 | Not Implemented,表示服务器不支持当前请求所需要的某个功能 |
503 | service unavailable,表明服务器暂时处于超负载或正在停机维护,无法处理请求 |
GET:从服务器上获取数据,也就是所谓的查,仅仅是获取服务器资源,不进行修改。
POST:向服务器提交数据,这就涉及到了数据的更新,也就是更改服务器的数据。
PUT:英文含义是放置,也就是向服务器新添加数据,就是所谓的增。
DELETE:从字面意思也能看出,这种方式就是删除服务器数据的过程。
Get 是不安全的,因为在传输过程,数据被放在请求的 URL 中;Post 的所有操作对用户来说都是不可见的。但是这种做法也不时绝对的,大部分人的做法也是按照上面的说法来的,但是也可以在 get 请求加上 request body,给 post 请求带上 URL 参数。
Get 请求提交的 url 中的数据最多只能是 2048 字节,这个限制是浏览器或者服务器给添加的,http 协议并没有对 url 长度进行限制,目的是为了保证服务器和浏览器能够正常运行,防止有人恶意发送请求。Post 请求则没有大小限制。
Get 限制 Form 表单的数据集的值必须为 ASCII 字符;而 Post 支持整个 ISO10646字符集。
Get 执行效率却比 Post 方法好。Get 是 form 提交的默认方法。
GET 产生一个 TCP 数据包;POST 产生两个 TCP 数据包。
对于 GET 方式的请求,浏览器会把 http header 和 data 一并发送出去,服务器响应 200(返回数据);而对于 POST,浏览器先发送 header,服务器响应 100 continue,浏览器再发送 data,服务器响应 200 ok(返回数据)。
存储位置与安全性:Cookie 数据存放在客户端上,安全性较差,Session 数据放在服务器上,安全性相对更高;
存储空间:单个 Cookie 保存的数据不能超过4 K,很多浏览器都限制一个站点最多保存 20 个 Cookie,Session 无此限制
占用服务器资源:Session 一定时间内保存在服务器上,当访问增多,占用服务器性能,考虑到服务器性能方面,应当使用 Cookie。
Session 机制存在服务器压力增大,CSRF 跨站伪造请求攻击,扩展性不强等问题;
Session 存储在服务器端,Token 存储在客户端
Token 提供认证和授权功能,作为身份认证,Token 安全性比 Session 好;
Session这种会话存储方式方式只适用于客户端代码和服务端代码运行在同一台服务器上,Token 适用于项目级的前后端分离(前后端代码运行在不同的服务器下)
void init(ServletConfig config) throws ServletException
void service(ServletRequest req, ServletResponse resp) throws ServletException, java.io.IOException
void destory()
java.lang.String getServletInfo()
ServletConfig getServletConfig()
手动通过 URL 传值、隐藏表单传递 Session ID。
用文件、数据库等形式保存 Session ID,在跨页过程中手动调用。
原文链接:https://blog.csdn.net/ThinkWon/article/details/104903925