vlambda博客
学习文章列表

JAVA面试系列之网络通讯

点击蓝字

1、TCP、UDP、HTTP

  • 传输控制协议 TCP(Transmisson Control Protocol)--提供面向连接的,可靠的数据传输服务。

  • 用户数据协议 UDP(User Datagram Protocol)--提供无连接的,尽最大努力的数据传输服务(不保证数据传输的可靠性)。

  • HTTP 协议,全称超文本传输协议,HTTP 是一个无状态(stateless)协议


2、为什么要三次握手,四次挥手

为什么要三次握手?

三次握手的目的是建立可靠的通信信道,说到通讯,简单来说就是数据的发送与接收,而三次握手最主要的目的就是双方确认自己与对方的发送与接收是正常的。

流程:

    • 客户端–发送带有 SYN 标志的数据包–一次握手–服务端

    • 服务端–发送带有 SYN/ACK 标志的数据包–二次握手–客户端

    • 客户端–发送带有带有 ACK 标志的数据包–三次握手–服务端



    JAVA面试系列之网络通讯

    SYN 同步序列编号(Synchronize Sequence Numbers) 是 TCP/IP 建立连接时使用的握手信号。在客户机和服务器之间建立正常的 TCP 网络连接时,客户机首先发出一个 SYN 消息,服务器使用 SYN-ACK 应答表示接收到了这个消息,最后客户机再以 ACK(Acknowledgement)消息响应。这样在客户机和服务器之间才能建立起可靠的 TCP 连接,数据才可以在客户机和服务器之间传递。


为什么要四次挥手

JAVA面试系列之网络通讯



  • 客户端-发送一个 FIN,用来关闭客户端到服务器的数据传送

  • 服务器-收到这个 FIN,它发回一 个 ACK,确认序号为收到的序号加 1 。和 SYN 一样,一个 FIN 将占用一个序号

  • 服务器-关闭与客户端的连接,发送一个 FIN 给客户端

  • 客户端-发回 ACK 报文确认,并将确认序号设置为收到序号加 1


  1. DNS 解析

  2. TCP 连接

  3. 发送 HTTP 请求

  4. 服务器处理请求并返回 HTTP 报文

  5. 浏览器解析渲染页面

  6. 连接结束

用到的协议:TCP、IP、OSPF、ARP、HTTP


4、Http是无状态还是有状态,如何保存用户状态?

无状态

Session来保存状态,大部分情况下,我们都是通过在 Cookie 中附加一个 Session ID 来方式来跟踪。

Cookie 被禁用怎么办?

最常用的就是利用 URL 重写把 Session ID 直接附加在 URL 路径的后面。


5、什么是长连接,什么是短连接

  • 短连接:客户端和服务器每进行一次HTTP操作,就建立一次连接,任务结束就中断连接

  • 长连接:客户端和服务器之间用于传输HTTP数据的TCP连接不会关闭,客户端再次访问这个服务器时,会继续使用这一条已经建立的连接。

TCP的连接有长有短。另外,HTTP 1.0确实是短连接,但是,HTTP 1.0加入了keepalive之后,也可以实现长连接。再到后来,出现了websocket,就是默认长连接的协议(注意默认两个字),从HTTP/1.1起,默认使用长连接,用以保持连接特性


6、转发和重定向

1、请求次数

3、是否共享数据

重定向两次请求不共享数据,转发一次请求共享数据(在request级别使用信息共享,使用重定向必然出错);

4、跳转限制

重定向可以跳转到任意URL,转发只能跳转本站点资源;

5、发生行为不同

重定向是客户端行为,转发是服务器端行为;


7、NIO,BIO,AIO

同步与异步

  • 同步:发起一个调用之后,未处理完请求之前不返回

  • 异步:发起一个调用之后,立即返回响应,但是并没有返回结果,调用者可以继续执行其他操作,通过事件或者回调等返回异步操作结果

阻塞与非租塞

  • 阻塞:发起一个请求,调用者一直等待请求返回结果,当前线程被挂起,无法从事其他任务

  • 非租塞:发起一个请求,调用者不用一直等待结果返回,可以去干其他事


BIO:同步阻塞  ,数据的读取写入必须阻塞在一个线程内等待其完成,一个请求一个线程,当然我们可以采用线程池来实现伪异步IO


NIO:同步非租塞,NIO和传统的IO区别,NIO是面向Buffer缓冲区的,IO是面向流的

  • Channel(通道)   可以读数据,可以写数据,非租塞通道

  • Buffer(缓冲区)

  • Selector(选择器)  Selector与Channel是相互配合使用的,将Channel注册在Selector上之后,才可以正确的使用Selector,但此时Channel必须为非阻塞模式。Selector可以监听Channel的四种状态(Connect、Accept(准备好进行连接)、Read、Write),当监听到某一Channel的某个状态时,才允许对Channel进行相应的操作。

JAVA面试系列之网络通讯

AIO:异步非租塞





程序员 Mr.Fire