美文网首页
网络编程面试题总结

网络编程面试题总结

作者: 晴天M雨天 | 来源:发表于2020-05-11 20:54 被阅读0次

    网络编程知识
    → tcp、udp、http、https 等常用协议
    tcp协议:传输控制协议(TCP,Transmission Control Protocol)是为了在不可靠的互联网络上提供可靠的端到端字节流而专门设计的一个传输协议。

    三次握手与四次关闭、
    三次握手流程如下
    1client向server发送一个消息syn (状态client syn_sent server listen )
    2server向client 发送syn+ack, client 收到server发送的syn+ack (状态client ESTABLISHED server SYN_RCVD )
    3client向server发送一个ack (状态client ESTABLISHED server ESTABLISHED )
    三次握手是为了建立双向连接,syn 洪水攻击 导致大量连接处于 SYN_RCVD 状态;
    可以设置 tcp_synack_retries = 0 加快半链接的回收速度,或者调大 tcp_max_syn_backlog 来应对少量的 SYN 洪水攻击
    四次关闭流程如下;
    1client向server发送一个消息fin(状态client 由ESTABLISHED 变为FIN_WAIT_1 server 由 ESTABLISHED 变为CLOSE_WAIT )
    2server向client发送一个消息ack ,client收到以后FIN_WAIT_1 变成为FIN_WAIT_2
    3server发送完数据回向client发送 FIN(server 由 CLOSE_WAIT 变为LAST_ACK )
    4Client 端收到 Server 端的 FIN 后,回复 ACK,然后进入 TIME_WAIT 状态。TIME_WAIT 状态下需要等待 2 倍的最大报文段生存时间,来保证链接的可靠关闭,之后才会进入 CLOSED 关闭状态。而 Server 端收到 ACK 后直接就进入 CLOSED 状态。
    这里等待 2 倍的最大报文段生存时间的原因
    1保证 TCP 协议的全双工连接能够可靠关闭;
    2保证这次连接的重复数据段从网络中消失,防止端口被重用时可能产生数据混淆。
    开发中 Socket 处在 TIME_WAIT 或者 CLOSE_WAIT 状态的问题。一般开启 tcp_tw_reuse 和 tcp_tw_recycle 能够加快 TIME-WAIT 的 Sockets 回收;而大量 CLOSE_WAIT 可能是被动关闭的一方存在代码 bug,没有正确关闭链接导致的。

    流量控制和拥塞控制、
    TCP 是如何通过滑动窗口机制来实现流量控制的
    所谓流量控制就是让发送发送速率不要过快,让接收方来得及接收。利用滑动窗口机制就可以实施流量控制。
    原理这就是运用TCP报文段中的窗口大小字段来控制,发送方的发送窗口不可以大于接收方发回的窗口大小。
    TCP的四种拥塞控制算法(后续详细补充)
    1.慢开始
    2.拥塞控制
    3.快重传
    4.快恢复
    OSI 七层模型、
    应用层
    网络服务与最终用户的一个接口。
    协议有:HTTP FTP TFTP SMTP SNMP DNS TELNET HTTPS POP3 DHCP
    表示层
    数据的表示、安全、压缩。(在五层模型里面已经合并到了应用层)
    格式有,JPEG、ASCll、EBCDIC、加密格式等 [2] **
    会话层
    建立、管理、终止会话。(在五层模型里面已经合并到了应用层)
    对应主机进程,指本地主机与远程主机正在进行的会话
    传输层
    定义传输数据的协议端口号,以及流控和差错校验。
    协议有:
    TCP UDP,数据包一旦离开网卡即进入网络传输层**
    Telnet是一种简单的基于文本的网络协议,用于通过TCP / IP网络(如Internet)访问远程计算机和终端,但也用于初始设置设备,如网络硬件。”
    测试连个端口是否畅通
    端口未打开

    $ telnet 101.199.97.65 62715
    Trying 101.199.97.65...
    telnet: connect to address 101.199.97.65: Connection refused
    此时,命令已退出。

    端口已打开

    $ telnet 101.199.97.65 62715
    Trying 101.199.97.65...
    Connected to 101.199.97.65.
    Escape character is '^]'.
    此时命令未退出。
    网络层
    进行逻辑地址寻址,实现不同网络之间的路径选择。
    协议有:ICMP IGMP IP(IPV4 IPV6)
    ping 使用ICMP 协议看两个主机是否连通
    数据链路层
    建立逻辑连接、进行硬件地址寻址、差错校验 [3] 等功能。(由底层网络定义协议)
    将比特组合成字节进而组合成帧,用MAC地址访问介质,错误发现但不能纠正。
    物理层
    建立、维护、断开物理连接。(由底层网络定义协议)

    tcp 粘包与拆包
    为什么会发生TCP粘包、拆包?
    发生TCP粘包、拆包主要是由于下面一些原因:

    1. 应用程序写入的数据大于套接字缓冲区大小,这将会发生拆包。
      2.应用程序写入数据小于套接字缓冲区大小,网卡将应用多次写入的数据发送到网络上,这将会发生粘包。
      3.进行MSS(最大报文长度)大小的TCP分段,当TCP报文长度-TCP头部长度>MSS的时候将发生拆包。
      4.接收方法不及时读取套接字缓冲区数据,这将发生粘包。

    粘包、拆包解决办法
    TCP本身是面向流的,作为网络服务器,如何从这源源不断涌来的数据流中拆分出或者合并出有意义的信息呢?通常会有以下一些常用的方法:
    1、发送端给每个数据包添加包首部,首部中应该至少包含数据包的长度,这样接收端在接收到数据后,通过读取包首部的长度字段,便知道每一个数据包的实际长度了。
    2、发送端将每个数据包封装为固定长度(不够的可以通过补0填充),这样接收端每次从接收缓冲区中读取固定长度的数据就自然而然的把每个数据包拆分开来。
    3、可以在数据包之间设置边界,如添加特殊符号,这样,接收端通过这个边界就可以将不同的数据包拆分开。

    → http/1.0 http/1.1 http/2 之前的区别
    HTTP1.0和HTTP1.1的一些区别

    HTTP1.0最早在网页中使用是在1996年,那个时候只是使用一些较为简单的网页上和网络请求上,而HTTP1.1则在1999年才开始广泛应用于现在的各大浏览器网络请求中,同时HTTP1.1也是当前使用最为广泛的HTTP协议。 主要区别主要体现在:

    缓存处理,在HTTP1.0中主要使用header里的If-Modified-Since,Expires来做为缓存判断的标准,HTTP1.1则引入了更多的缓存控制策略例如Entity tag,If-Unmodified-Since, If-Match, If-None-Match等更多可供选择的缓存头来控制缓存策略。

    带宽优化及网络连接的使用,HTTP1.0中,存在一些浪费带宽的现象,例如客户端只是需要某个对象的一部分,而服务器却将整个对象送过来了,并且不支持断点续传功能,HTTP1.1则在请求头引入了range头域,它允许只请求资源的某个部分,即返回码是206(Partial Content),这样就方便了开发者自由的选择以便于充分利用带宽和连接。

    错误通知的管理,在HTTP1.1中新增了24个错误状态响应码,如409(Conflict)表示请求的资源与资源的当前状态发生冲突;410(Gone)表示服务器上的某个资源被永久性的删除。

    Host头处理,在HTTP1.0中认为每台服务器都绑定一个唯一的IP地址,因此,请求消息中的URL并没有传递主机名(hostname)。但随着虚拟主机技术的发展,在一台物理服务器上可以存在多个虚拟主机(Multi-homed Web Servers),并且它们共享一个IP地址。HTTP1.1的请求消息和响应消息都应支持Host头域,且请求消息中如果没有Host头域会报告一个错误(400 Bad Request)。

    长连接,HTTP 1.1支持长连接(PersistentConnection)和请求的流水线(Pipelining)处理,在一个TCP连接上可以传送多个HTTP请求和响应,减少了建立和关闭连接的消耗和延迟,在HTTP1.1中默认开启Connection: keep-alive,一定程度上弥补了HTTP1.0每次请求都要创建连接的缺点。

    HTTP2.0和HTTP1.X相比的新特性

    新的二进制格式(Binary Format),HTTP1.x的解析是基于文本。基于文本协议的格式解析存在天然缺陷,文本的表现形式有多样性,要做到健壮性考虑的场景必然很多,二进制则不同,只认0和1的组合。基于这种考虑HTTP2.0的协议解析决定采用二进制格式,实现方便且健壮。

    多路复用(MultiPlexing),即连接共享,即每一个request都是是用作连接共享机制的。一个request对应一个id,这样一个连接上可以有多个request,每个连接的request可以随机的混杂在一起,接收方可以根据request的 id将request再归属到各自不同的服务端请求里面。

    header压缩,如上文中所言,对前面提到过HTTP1.x的header带有大量信息,而且每次都要重复发送,HTTP2.0使用encoder来减少需要传输的header大小,通讯双方各自cache一份header fields表,既避免了重复header的传输,又减小了需要传输的大小。

    服务端推送(server push),同SPDY一样,HTTP2.0也具有server push功能。

    http 中 get 和 post 区别
     Http定义了与服务器交互的不同方法,最基本的方法有4种,分别是GET,POST,PUT,DELETE。URL全称是资源描述符,我们可以这样认为:一个URL地址,它用于描述一个网络上的资源,而HTTP中的GET,POST,PUT,DELETE就对应着对这个资源的查,改,增,删4个操作。到这里,大家应该有个大概的了解了,GET一般用于获取/查询资源信息,而POST一般用于更新资源信息。
    get 是显示请求 地址可以保存 长度有限制 不安全 幂等性
    post 是隐式请求 安全系数高 长度没有限制 有效防止乱码
    常见的 web 请求返回的状态码
    404、302、301、500分别代表什么
    404 找不到页面
    302 可以简单的理解为该资源原本确实存在,但已经被临时改变了位置;
    301被请求的资源已永久移动到新位置,并且将来任何对此资源的引用都应该使用本响应返回的若干个 URI 之一。
    500 服务器错误
    → http/3
    互联网工程任务组(IETF)官员透露,HTTP-over-QUIC实验协议将重命名为HTTP / 3,并有望成为HTTP协议的第三个正式版本。这是由Mark Nottingham的这一原始建议引发的。
    下一代HTTP底层协议将弃用TCP协议,改用QUIC技术。不过运营商网络丢UDP包这个问题可能一时半会儿比较难解决。我们玩QUIC路还很长。
    IETF中的QUIC工作组致力于创建QUIC传输协议。QUIC是通过UDP完成的TCP替换。最初,QUIC起初是谷歌的努力,然后更多的是“HTTP / 2加密 - UDP”协议。
    当IETF中的工作开始标准化协议时,它分为两层:传输和HTTP部分。这种传输协议也可以用于传输其他数据,而不只是显式地用于HTTP或类似HTTP的协议。但是这个名字仍然是QUIC。
    社区中的人们已经使用非正式名称如iQUIC和gQUIC来指代这些不同版本的协议,以将QUIC协议与IETF和Google分开(因为它们在细节上差异很大)。通过“iQUIC”发送HTTP的协议长时间称为“hq”(HTTP-over-QUIC)。
    那么Quic是什么?
    Quic(QuickUDP Internet Connections)是一种新的传输方式,与TCP相比,它减少了延迟。表面上,Quic非常类似于在UDP上实现的TCP+TLS+HTTP/2。由于TCP是在操作系统内核和中间件固件中实现的,因此对TCP进行重大更改几乎是不可能的。然而,由于Quic是构建在UDP之上的,所以它没有受到这样的限制。
    → Java RMI,Socket,HttpClient
    java rmi 是一个基于java实现的远程调用,可用于分布式方法调用,相比socket 占用较多带宽,不够灵活,socket是基于tcp /ip 协议,相对于java rmi 灵活,socket 上层可以用其他语言,java rmi 调用方和服务提供方都要使用java。
    HttpClient 是应用层http协议,底层基于tcp /ip,操作方便,可以实现客户端与服务器的通信。
    → cookie 与 session
    cookie 被禁用,如何实现 session
    https://blog.csdn.net/ai_shuyingzhixia/article/details/80778183
    → 用 Java 写一个简单的静态文件的 HTTP 服务器
    实现思路;
    1、使用 ServerSocket 监听某一端口,然后等待连接获取 Socket对象。
    2、创建一个类 HttpServer 继承 java.lang.Thread 类,重写 run()方法,执行浏览器请求。
    3、获得浏览器请求,解析资源文件路径。
    4、读取资源文件,响应给浏览器。
    → 用 Java 实现 FTP、SMTP 协议
    FTP本文利用apache ftp工具实现文件的上传下载和删除.
    SMTP 通过javamail实现
    → 进程间通讯的方式
    linux使用的进程间通信方式
    管道(pipe),流管道(s_pipe)和有名管道(FIFO)
    信号(signal)
    消息队列
    共享内存
    信号量
    套接字(socket)
    → 什么是 CDN?如果实现?
    https://www.jianshu.com/p/14dede92b02f
    → DNS
    什么是 DNS 、记录类型: A 记录、CNAME 记录、AAAA 记录等
    域名解析、根域名服务器
    dns 域名解析服务器
    DNS 污染、DNS 劫持、公共 DNS:114 DNS、Google DNS、OpenDNS
    → 反向代理
    正向代理、反向代理
    一张图说明正向代理、反向代理

    image.png
    →反向代理服务器
    nginx的反向代理

    相关文章

      网友评论

          本文标题:网络编程面试题总结

          本文链接:https://www.haomeiwen.com/subject/epbuwhtx.html