面试专题之网络编程

题目

  1. TCP 三次握手、四次挥手流程?三次握手作用?为什么三次,为什么四次?
  2. TCP 和 UDP 区别,优缺点?有 TCP 为什么还要有 UDP?举几个实际应用的例子
  3. TCP 粘包和拆包问题有了解吗?
  4. TCP 是怎样保持连接的?怎样识别不同请求的?
  5. 用 Java 的套接字编程实现一个多线程的回显(echo)服务器。
  6. socket 选项 TCP NO DELAY 是指什么?
  7. Http请求的过程与原理
  8. 关于CP连接可靠通信的几个问题
  9. tcp是如何保证安全的
  10. https和http的区别?
  11. get/post区别?
  12. cookie和session的区别
  13. xss攻击和ddos?
  14. 你知道的协议有哪些,在哪个层,有什么用?
  15. 常见状态码及原因短语

答案

  1. TCP 三次握手、四次挥手流程?三次握手作用?为什么三次,为什么四次?

三次握手:
刚开始客户端处于 closed 的状态,服务端处于 listen 状态。然后
第一次握手:客户端给服务端发一个 SYN 报文,并指明客户端的初始化序列号 ISN(c)。此时客户端处于 SYN_Send 状态。
第二次握手:服务器收到客户端的 SYN 报文之后,会以自己的 SYN 报文作为应答,并且也是指定了自己的初始化序列号 ISN(s),同时会把客户端的 ISN + 1 作为 ACK 的值,表示自己已经收到了客户端的 SYN,此时服务器处于 SYN_REVD 的状态。
第三次握手:客户端收到 SYN 报文之后,会发送一个 ACK 报文,当然,也是一样把服务器的 ISN + 1 作为 ACK 的值,表示已经收到了服务端的 SYN 报文,此时客户端处于 establised 状态。

服务器收到 ACK 报文之后,也处于 establised 状态,此时,双方以建立起了链接。

四次挥手:
刚开始双方都处于 establised 状态,假如是客户端先发起关闭请求,则
第一次挥手:客户端发送一个 FIN 报文,报文中会指定一个序列号。此时客户端处于FIN_WAIT1状态。
第二次握手:服务端收到 FIN 之后,会发送 ACK 报文,且把客户端的序列号值 + 1 作为 ACK 报文的序列号值,表明已经收到客户端的报文了,此时服务端处于 CLOSE_WAIT状态。
第三次挥手:如果服务端也想断开连接了,和客户端的第一次挥手一样,发给 FIN 报文,且指定一个序列号。此时服务端处于 LAST_ACK 的状态。
第四次挥手:客户端收到 FIN 之后,一样发送一个 ACK 报文作为应答,且把服务端的序列号值 + 1 作为自己 ACK 报文的序列号值,此时客户端处于 TIME_WAIT 状态。需要过一阵子以确保服务端收到自己的 ACK 报文之后才会进入 CLOSED 状态

服务端收到 ACK 报文之后,就处于关闭连接了,处于 CLOSED 状态。

作用:
简要回答:作用是为了确认双方的接收与发送能力是否正常。
详细回答:
a. 确认双方的接受能力、发送能力是否正常。
b. 指定自己的初始化序列号,为后面的可靠传送做准备。
c. 如果是 https 协议的话,三次握手这个过程,还会进行数字证书的验证以及加密密钥的生成到。

为什么是连接和关闭握手是三次和四次?
因为当Server端收到Client端的SYN连接请求报文后,可以直接发送SYN+ACK报文。其中ACK报文是用来应答的,SYN报文是用来同步的。但是关闭连接时,当Server端收到FIN报文时,很可能并不会立即关闭SOCKET,所以只能先回复一个ACK报文,告诉Client端,“你发的FIN报文我收到了”。只有等到我Server端所有的报文都发送完了,我才能发送FIN报文,因此不能一起发送。故需要四步握手。

推荐阅读:面试中被问到三次握手四次挥手应该怎么回答?
TCP的三次握手与四次挥手理解及面试题(很全面)

  1. TCP 和 UDP 区别,优缺点?有 TCP 为什么还要有 UDP?举几个实际应用的例子

简要回答:
TCP保证数据安全,以流的形式传输,一对一双全工,能保证数据顺序
UDP不保证数据安全,以数据报的形式传输,一对多,不保证数据顺序

详细回答:
协议层面
(1) TCP是面向连接的协议,有确认重传机制,流量控制机制等;而UDP是非面向连接的协议,尽力而为的传送数据,重传由上层协议来控制,也可以使用connect()来控制。
(2)从头部结构来说,TCP因为有选项部分,所以有首部长度字段;而UDP没有选项部分,所以不需要首部长度字段。
(3)TCP的checksum部分是必需的;UDP的选项部分是可选的,不填充的话默认为全零。
(4)TCP避免分段,因为有重传机制本来就浪费了一些带宽,一旦出现分段,那么重传会大量增加,将会浪费大量带宽并且会严重降低传输效率;而UDP则不关心分不分段,且因为UDP的头部小(只有8字节,而TCP头部最小也得20字节),故可以携带更多的数据。
(5)TCP是基于数据流传输的,所以应用程序产生的全体数据与真正发送的单个IP数据报没有什么联系;而UDP是面向数据报的传输层协议,进程的每个操作产生都正好产生一个UDP数据报,并组装成一个IP数据报发送。
应用层面
(1)先说一下TCP的优缺点。优点:TCP是可靠的连接,由于有基本的重传确认机制,可以保证把一个数据块完完整整的从A传到B;缺点也是因优点而生,因为有三次握手,所以会传输更多的包,浪费一些带宽;因为需要可靠地连接进行通信,则需要双方都必须持续在线,所以在通信过程中server需要维持非常大的并发连接,浪费了系统资源,甚至会出现宕机;再者就是因为有重传确认,则会浪费一部分的带宽,且在不好的网络中,会因为不断地连接断开连接,严重降低了传输效率。
(2)相对于TCP来说,UDP是非面向连接的不可靠的协议,其优点也因为缺点而生。首先,因为没有三次握手,所以会起步比较快,延时小;另外,由于不需要双方持续在线,所以server不用维护巨量的并发连接,节省了系统资源;三,因为没有重传确认,虽然到达的数据可能会有所缺失,但在不影响使用的情况下,能更高效的利用网络带宽。

为什么还要有udp:
TCP适合实时性要求不高,但要求内容要完整传输的应用。相比而言,UDP由于无连接、无重传确认,所以传输效率高、延时小,适合实时性要求高的应用,如游戏服务器,音频,视频等;另外,由于不用维持大的并发量,所以适合巨量服务的server,加上合适的时间控制,可以用来设计更大的并发服务器;再者就是,UDP可以更高效的利用网络带宽。

例子:
QQ,在建立连接阶段,使用的是面向连接的TCP协议,通过三次握手来完成;然后,在文字数据传输阶段,使用的是UDP协议,但需要中间服务器转发(估计是使用了connect()的UDP,QQ离线发送/接收数据的基础);
然后,音视频数据的发送一定是使用的UDP,因为一般的客户可以容忍稍微模糊(略有缺失的数据块)的声音或视频,但估计不会接受一会断开一会连接(因为TCP容易断线)的音视频;
而文件传输则使用了P2P的协议,当前大多P2P使用的UTP协议也是基于UDP的,因为使用TCP的话会浪费大量的带宽。

  1. TCP 粘包和拆包问题有了解吗?
    概念:
    Tcp是个“流协议”,所谓流,就是没有界限的一连串数据,没有界限。TCP底层不了解业务数据的含义,它会根据TCP缓冲区的实际情况进行包的划分,所以业务上认为,一个完整的包可能被TCP拆分为多个包进行发送,也可能把多个小包封装成一个大的数据包进行发送,这就是所谓的TCP粘包和拆包问题。
    在这里插入图片描述
    产生原因:
    (1)应用程序write写入的字节大小大于套接口缓冲区的大小
    (2)进行MSS大小的TCP分段
    (3)以太网帧的payload大于MTU进行IP分片
    在这里插入图片描述
    解决方案:
    (1)消息定长,例如每个报文固定200字节,如果不够,空位补空格
    (2)在包尾增加回车换行符进行分割,如FTP协议
    (3)将消息分为消息头和消息体,消息头中包含消息的长度,字段等信息
    (4)更复杂的应用层协议

推荐阅读:
TCP粘包和拆包

还有本人所写的netty高级,在第二部分中通过代码实验拆包和粘包问题,还有拆包的解决方案

  1. TCP 是怎样保持连接的?怎样识别不同请求的?
    TCP长连接保持:KeepAlive。TCP协议的实现里有一个KeepAlive机制,自动检测能否和对方连通并保持连接。

TCP识别不同的请求:每个连接建立时,都会保存一个唯一的套接字,有了这个套接字,你就知道对方的IP地址、端口号等信息。这样,通过这个套接字,就可以向指定方发送信息了。

  1. 用 Java 的套接字编程实现一个多线程的回显(echo)服务器。
    Java - 用Java的套接字编程实现一个多线程的回显(echo)服务器。

  2. socket 选项 TCP NO DELAY 是指什么?
    详解Socket编程—TCP_NODELAY选项

  3. Http请求的过程与原理
    (1)DNS解析,先从浏览器缓存、内存缓存、host文件、DNS服务器一步步把url解析成ip地址
    (2)拿到ip地址之后如果是自己网段的,一般路由器里都有对应的mac地址,可以直接获得然后三次握手建立TCP连接,如果不是自己网段的,还需要发到网关,由arp协议得到mac地址。因为七层模型都是上层依赖下层,你想传输肯定得把网络和数据链路层搞定。
    (3)建立起TCP连接后就可以发送HTTP请求了,这个请求到了服务端可能会有负载均衡、重定向,
    (4)处理完请求后把请求返回,由浏览器解析数据时发现还有一些静态资源比如CSS JS或图片,又会发起另外的请求,这就是后话了。
    (5)处理完成后B/S架构不像C/S,一般都是短连接,四次挥手就关闭了
    Http请求的过程与原理

  4. 关于CP连接可靠通信的几个问题

在可靠的通讯连接方便: 采用三次我握手的机制

(1)TCP是怎么保证没有比特差错的?
为了保证接受的报文段是没有比特差错的,TCP中引入了这三个机制:
①差错检测:也就是引入校验和。在TCP的首部中有一个占据16为的空间用来放置校验和的结果。在源主机的运输层开始接受到一个从应用进程传下来的数据的时候,会将他封装成一个报文段,加上至少20字节的首部。同时会将这个报文段首部和数据还有伪首部部分一起根据取反码和的形式计算出校验和添加到首部中。传输到目的主机的运输层之后,会计算这个通过这个校验和检查是否存在比特差错。
②控制消息:当检测到发生比特差错之后要对发送发进行信息的反馈使得能够根据返回决定是否进行重传。一般理论上会有两种返回一种是肯定的反馈ACK,在TCP中反馈信息是接收到的分许中最后一个字节序号的下一位。一种是否定反馈,但是为了减少网络中的注入分组的数量减少负担取而代之的是通过发送上一个分组的确认信息表明当下这个分组没有正确的接收。
③重传:如果接收方接收到的是一个换掉的ACK或者上一个分组的确认之后意味着要再发一遍这个分许。怎么发后面将分析到。

(2)TCP是怎么保证重传的?
发送发重传之后,接收方值怎么知道这个分组是重传的分许,或者说接收方怎么知道我是不是已经接受了这个分组的?引入了序列化的机制。由于TCP是面向字节流的协议,所以会为每一个字节编制一个序号。同时在TCP首部中也会有这个序号字段。但是由于一个分组中包含了多个字节,所以说这个TCP首部中的序号是分组中发送多个字节的第一个字节的序号值。

(3)TCP是怎么处理分组丢弃的问题的?
以上这几个问题是基于分组没有丢弃但是仅仅发生比特差错的时候。如果发生比特差错怎么办。协议张引入了定时器这个机制。也就是说在某一时刻设置一个定时器,只要在定时器设置的时间内没有收到对应分组的确认信息,那么就会重传对应的一个或者几个分组。

(5)TCP是如何提高传输性能的?
在TCP协议中为了提高传输性能是不可能一次只能发送一个分组介绍到这个分组确认之后在发送下一个分组的,因为这样对于信道的利用效率会大大减少,所以为了提高信道的利用率一般一次发送多个分组,并且将这几个分组为单位开始设置定时器。
同时也引入了快速重传的机制。

(6)TCP为什么引入接受缓存这个数据结构?
如果没有接受缓存的话,或者说只有一个缓存的话,为了保证接受的数据是按顺序传输的,所以如果位于x序号之后的序号分组先到达目的主机的运输层的话必然丢弃,这样的话将在重传上花费很大的开销,所以一般如果有过大的序号达到接收端,那么会按照序号缓存起来等待之前的序号分许到达,然后一并交付到应用进程。

推荐阅读 TCP是如何保证可靠数据传输的?

  1. tcp是如何保证安全的
    (1)应用数据被分割成 TCP 认为最适合发送的数据块。
    (2)TCP 给发送的每一个包进行编号,接收方对数据包进行排序,把有序数据传送给应用层。
    (3)校验和: TCP 将保持它首部和数据的检验和。这是一个端到端的检验和,目的是检测数据在传输过程中的任何变化。如果收到段的检验和有差错,TCP 将丢弃这个报文段和不确认收到此报文段。
    (4)TCP 的接收端会丢弃重复的数据。
    (5)流量控制: TCP 连接的每一方都有固定大小的缓冲空间,TCP的接收端只允许发送端发送接收端缓冲区能接纳的数据。当接收方来不及处理发送方的数据,能提示发送方降低发送的速率,防止包丢失。TCP 使用的流量控制协议是可变大小的滑动窗口协议。 (TCP 利用滑动窗口实现流量控制)
    (6)拥塞控制: 当网络拥塞时,减少数据的发送。
    (7)停止等待协议: 也是为了实现可靠传输的,它的基本原理就是每发完一个分组就- 停止发送,等待对方确认。在收到确认后再发下一个分组。 超时重传: 当 TCP 发出一个段后,它启动一个定时器,等待目的端确认收到这个报文段。如果不能及时收到一个确认,将重发这个报文段。

推荐阅读 TCP 协议如何保证可靠传输

  1. https和http的区别?
    (1)https 协议需要到 ca 申请证书,一般免费证书较少,因而需要一定费用。
    (2)http 是超文本传输协议,信息是明文传输,无状态,连接较为简单
    https 则是具有安全性的,在TCP/IP协议上封装了一层TCL/SSL加密传输协议,以数字证书的形式来保证数据安全(将用户数据hash后由公钥加密成密文,拿到报文后解密密文,并再次将数据hash,比较数据是否相同,第一次传输用RSA得到对称加密的秘钥,之后都用对称加密)
    (3)http 和 https 使用的是完全不同的连接方式,用的端口也不一样,前者是 80,后者是 443。

  2. get/post区别?
    本质上是无区别的,
    在浏览器端,get一般由url调用,顺带一提url的限制也是浏览器的原因,事实上http标准协议对url的长度没有限制,而post一般由表单调用
    在restful规范中,get被认为是幂等的,用来请求数据,而post不幂等,用来实现资源的创建
    推荐阅读GET 和 POST 到底有什么区别?

  3. cookie和session的区别
    cookie保存在浏览器端,一般有4BK的大小限制,cookie会有cros的安全问题,简单来说就是别的恶心请求拿到了cookie之后每次请求都带上,解决方法是用token或者直接禁用cookie,使用token可以让特定的请求带上而不是每次请求都带上。
    session保存在服务器端,需要用url或者cookie请求sessionid拿到

  4. xss攻击和ddos?
    xss其原理是攻击者向有XSS漏洞的网站中输入恶意的 HTML 代码,当用户浏览该网站时,这段 HTML 代码会自动执行
    ddos 简单来说就是大量请求去攻击一个公用接口,使服务器负载上升
    什么是 DDoS 攻击?

  5. 你知道的协议有哪些,在哪个层,有什么用?
    简单挑几个记吧。。 TCP IP ARP RAPR PPPOE SSL HTTP FTP SMTP
    在这里插入图片描述

  6. 常见状态码及原因短语
    1XX请求成功,正在处理
    2XX请求成功,已经处理
    3XX 重定向
    301永久重定向
    302临时重定向
    4XX
    400 请求语法错误
    403 服务被拒绝
    404页面不存在
    5XX
    500服务器内部错误(报错了)
    502 服务不可用

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值