Java网络编程面试题

 

一、tcp和udp的区别 1javascript

二、tcp链接创建的时候3次握手,断开链接的4次握手的具体过程 1css

三、什么是同步?什么是异步? 2html

四、.什么是阻塞?什么是非阻塞? 5vue

五、什么是阻塞IO?什么是非阻塞IO? 6java

六、什么是同步IO?什么是异步IO? 7node

七、 IO模型有几种?分别是什么? 8linux

八、 Reactor和Proactor IO设计模式是什么? 13android

九、Java NIO 中的Buffer是什么?如何使用? 16web

十、Nio buffer 的内部结构是什么? 17面试

十一、Java NIO 中的 Channel是什么?有什么特色? 18

十二、Java NIO中的Selector是什么? 21

1三、简单讲一下文件IO中的Path和Files 22

1四、select、poll和epoll的区别 23

1五、网络编程中设计并发服务器,使用多进程 与 多线程 ,请问有什么区别? 29

1五、网络编程的通常步骤 29

1六、TCP的全称是? 31

1七、UDP的全称是? 31

1八、请说出TCP和UDP的区别? 31

1九、TCP为何不是两次链接?而是三次握手? 33

20、说明socket是什么? 34

2一、为何须要端口?端口是真实存在的仍是虚拟的概念? 35

2二、Java中,端口使用两个字节表示,能够表示多少个端口? UDP和TCP端口是各自独立的吗? 35

2三、URL类有什么做用? 35

2四、基于TCP的Socket网络编程的主要步骤是什么? 36

2五、【上机】写出创建TCP服务器ServerSocket的代码。并说明accept方法有什么特色? 37

2六、【上机】写出创建TCP客户端Socket的代码。并说明创建Socket后,经过什么方法Socket得到流对象? 37

2七、基于UDP的Socket网络编程的主要步骤是什么? 37

2八、【上机】使用UDP的方式,完成对象的传递。 38

2九、HTTPClient相关问题 39

30、NIO 和传统 BIO区别是什么? 40

3一、Java NIO 的几个核心组成部分是什么?做用分别是什么? 41

3二、简单说一下http协议? 47

3三、http协议下客户端请求报文是什么? 48

3四、描述一下http协议服务器响应报文有哪些? 49

3五、HTTP协议中经常使用的请求方法有哪些 50

3六、常见的HTTP状态码有哪些 51

3七、HTTP 协议中content-type指的是什么? 55

3八、网络传输协议本质和做用是什么? 65

3九、能够实现一个简单的网络协议吗? 65

 

 

1tcp和udp的区别 

TCP:是面向链接的流传输控制协议,具备高可靠性,确保传输数据的正确性,有验证重发机制,所以不会出现丢失或乱序。

UDP:是无链接的数据报服务,不对数据报进行检查与修改,无须等待对方的应答,会出现分组丢失、重复、乱序,但具备较好的实时性,UDP段结构比TCP的段结构简单,所以网络开销也小。

二、tcp链接创建的时候3次握手,断开链接的4次握手的具体过程

  1. 创建链接采用的3次握手协议,具体是指:

l 第一次握手是客户端connect链接到server

l 第二次server accept client的请求以后,向client端发送一个消息,至关于说我都准备好了,你链接上我了

l 第三次 就是client向server发送的,就是对第二次握手消息的确认。以后client和server就开始通信了。

2.断开链接的4次握手,具体以下:

l 断开链接的一端发送close请求是第一次握手

l 另一端接收到断开链接的请求以后须要对close进行确认,发送一个消息,这是第二次握手

l 发送了确认消息以后还要向对端发送close消息,要关闭对对端的链接,这是第3次握手

l 而在最初发送断开链接的一端接收到消息以后,进入到一个很重要的状态time_wait状态,这个状态也是面试官常常问道的问题,最后一次握手是最初发送断开链接的一端接收到消息以后。对消息的确认。

三、什么是同步?什么是异步?

同步:

若是有多个任务或者事件要发生,这些任务或者事件必须逐个地进行,一个事件或者任务的执行会致使整个流程的暂时等待,这些事件没有办法并发地执行;

异步:

若是有多个任务或者事件发生,这些事件能够并发地执行一个事件或者任务的执行不会致使整个流程的暂时等待。

这就是同步和异步。

举个简单的例子,假若有一个任务包括两个子任务A和B,对于同步来讲,当A在执行的过程当中,B只有等待,直至A执行完毕,B才能执行;而对于异步就是A和B能够并发地执行,B没必要等待A执行完毕以后再执行,这样就不会因为A的执行致使整个任务的暂时等待。

 

若是还不理解,能够先看下面这2段代码:

void fun1() {

}

 

void fun2() {

}

 

void function(){

    fun1();

    fun2()

    .....

    .....

}

这段代码就是典型的同步,在方法function中,fun1在执行的过程当中会致使后续的fun2没法执行,fun2必须等待fun1执行完毕才能够执行。

 

接着看下面这段代码:

void fun1() {

}

 

void fun2() {

}

 

void function(){

    new Thread(){

    public void run() {

        fun1();

    }

}.start();

 

new Thread(){

    public void run() {

        fun2();

    }

}.start();

.....

.....

}

这段代码是一种典型的异步,fun1的执行不会影响到fun2的执行,而且fun1和fun2的执行不会致使其后续的执行过程处于暂时的等待。

 

事实上,同步和异步是一个很是广的概念,它们的重点在于多个任务和事件发生时,一个事件的发生或执行是否会致使整个流程的暂时等待。我以为能够将同步和异步与Java中的synchronized关键字联系起来进行类比。当多个线程同时访问一个变量时,每一个线程访问该变量就是一个事件,对于同步来讲,就是这些线程必须逐个地来访问该变量,一个线程在访问该变量的过程当中,其余线程必须等待;而对于异步来讲,就是多个线程没必要逐个地访问该变量,能够同时进行访问。

 

同步和异步能够表如今不少方面,可是记住其关键在于多个任务和事件发生时,一个事件的发生或执行是否会致使整个流程的暂时等待。通常来讲,能够经过多线程的方式来实现异步,可是千万记住不要将多线程和异步画上等号,异步只是宏观上的一个模式,采用多线程来实现异步只是一种手段,而且经过多进程的方式也能够实现异步。同步和异步着重点在于多个任务的执行过程当中,一个任务的执行是否会致使整个流程的暂时等待

四、.什么是阻塞?什么是非阻塞?

阻塞:

当某个事件或者任务在执行过程当中,它发出一个请求操做,可是因为该请求操做须要的条件不知足,那么就会一直在那等待,直至条件知足;

非阻塞:

当某个事件或者任务在执行过程当中,它发出一个请求操做,若是该请求操做须要的条件不知足,会当即返回一个标志信息告知条件不知足,不会一直在那等待

举个简单的例子:

假如我要读取一个文件中的内容,若是此时文件中没有内容可读,对于同步来讲就是会一直在那等待,直至文件中有内容可读;而对于非阻塞来讲,就会直接返回一个标志信息告知文件中暂时无内容可读。

阻塞和非阻塞着重点在于发出一个请求操做时,若是进行操做的条件不知足是否会返会一个标志信息告知条件不知足。理解阻塞和非阻塞能够同线程阻塞类比地理解,当一个线程进行一个请求操做时,若是条件不知足,则会被阻塞,即在那等待条件知足。

 

五、什么是阻塞IO?什么是非阻塞IO?

在了解阻塞IO和非阻塞IO以前,先看下一个具体的IO操做过程是怎么进行的。

一般来讲,IO操做包括:对硬盘的读写、对socket的读写以及外设的读写。

当用户线程发起一个IO请求操做(本文以读请求操做为例),内核会去查看要读取的数据是否就绪,对于阻塞IO来讲,若是数据没有就绪,则会一直在那等待,直到数据就绪;对于非阻塞IO来讲,若是数据没有就绪,则会返回一个标志信息告知用户线程当前要读的数据没有就绪。当数据就绪以后,便将数据拷贝到用户线程,这样才完成了一个完整的IO读请求操做,也就是说一个完整的IO读请求操做包括两个阶段:

1)查看数据是否就绪;

2)进行数据拷贝(内核将数据拷贝到用户线程)。

那么阻塞(blocking IO)和非阻塞(non-blocking IO)的区别就在于第一个阶段,若是数据没有就绪,在查看数据是否就绪的过程当中是一直等待,仍是直接返回一个标志信息

Java中传统的IO都是阻塞IO,好比经过socket来读数据,调用read()方法以后,若是数据没有就绪,当前线程就会一直阻塞在read方法调用那里,直到有数据才返回;

而若是是非阻塞IO的话,当数据没有就绪,read()方法应该返回一个标志信息,告知当前线程数据没有就绪,而不是一直在那里等待。

六、什么是同步IO?什么是异步IO?

咱们先来看一下同步IO和异步IO的定义,在《Unix网络编程》一书中对同步IO和异步IO的定义是这样的:

A synchronous I/O operation causes the requesting process to be blocked until that I/O operation completes.

An asynchronous I/O operation does not cause the requesting process to be blocked.

从字面的意思能够看出:同步IO即 若是一个线程请求进行IO操做,在IO操做完成以前,该线程会被阻塞;而异步IO为 若是一个线程请求进行IO操做,IO操做不会致使请求线程被阻塞。

事实上,同步IO和异步IO模型是针对用户线程和内核的交互来讲的:

对于同步IO:当用户发出IO请求操做以后,若是数据没有就绪,须要经过用户线程或者内核不断地去轮询数据是否就绪,当数据就绪时,再将数据从内核拷贝到用户线程;

而异步IO:只有IO请求操做的发出是由用户线程来进行的,IO操做的两个阶段都是由内核自动完成,而后发送通知告知用户线程IO操做已经完成。也就是说在异步IO中,不会对用户线程产生任何阻塞。

这是同步IO和异步IO关键区别所在,同步IO和异步IO的关键区别反映在数据拷贝阶段是由用户线程完成仍是内核完成。因此说异步IO必需要有操做系统的底层支持

注意同步IO和异步IO与阻塞IO和非阻塞IO是不一样的两组概念

阻塞IO和非阻塞IO是反映在当用户请求IO操做时,若是数据没有就绪,是用户线程一直等待数据就绪,仍是会收到一个标志信息这一点上面的。

也就是说,阻塞IO和非阻塞IO是反映在IO操做的第一个阶段,在查看数据是否就绪时是如何处理的。

七、 IO模型有几种?分别是什么?

在《Unix网络编程》一书中提到了五种IO模型

分别是:阻塞IO、非阻塞IO、多路复用IO、信号驱动IO以及异步IO。

下面就分别来介绍一下这5种IO模型的异同。

1.阻塞IO模型

最传统的一种IO模型,即在读写数据过程当中会发生阻塞现象。

当用户线程发出IO请求以后,内核会去查看数据是否就绪,若是没有就绪就会等待数据就绪,而用户线程就会处于阻塞状态,用户线程交出CPU。当数据就绪以后,内核会将数据拷贝到用户线程,并返回结果给用户线程,用户线程才解除block状态。

典型的阻塞IO模型的例子为:

data = socket.read();

若是数据没有就绪,就会一直阻塞在read方法。

2.非阻塞IO模型

当用户线程发起一个read操做后,并不须要等待,而是立刻就获得了一个结果。若是结果是一个error时,它就知道数据尚未准备好,因而它能够再次发送read操做。一旦内核中的数据准备好了,而且又再次收到了用户线程的请求,那么它立刻就将数据拷贝到了用户线程,而后返回。

因此事实上,在非阻塞IO模型中,用户线程须要不断地询问内核数据是否就绪,也就说非阻塞IO不会交出CPU,而会一直占用CPU

 

典型的非阻塞IO模型通常以下:

伪代码

while(true){

  new MyThread(socket)

}

class MyThread{

    data = socket.read();

    if(data!= error){

        处理数据

        break;

    }

 

可是对于非阻塞IO就有一个很是严重的问题,在while循环中须要不断地去询问内核数据是否就绪,这样会致使CPU占用率很是高,所以通常状况下不多使用while循环这种方式来读取数据。

 

3.多路复用IO模型

多路复用IO模型是目前使用得比较多的模型。Java NIO实际上就是多路复用IO。

在多路复用IO模型中,会有一个线程不断去轮询多个socket的状态,只有当socket真正有读写事件时,才真正调用实际的IO读写操做。由于在多路复用IO模型中,只须要使用一个线程就能够管理多个socket,系统不须要创建新的进程或者线程,也没必要维护这些线程和进程,而且只有在真正有socket读写事件进行时,才会使用IO资源,因此它大大减小了资源占用。

  

在Java NIO中,是经过selector.select()去查询每一个通道是否有到达事件,若是没有事件,则一直阻塞在那里,所以这种方式会致使用户线程的阻塞。

也许有朋友会说,我能够采用 多线程+ 阻塞IO 达到相似的效果,可是因为在多线程 + 阻塞IO 中,每一个socket对应一个线程,这样会形成很大的资源占用,而且尤为是对于长链接来讲,线程的资源一直不会释放,若是后面陆续有不少链接的话,就会形成性能上的瓶颈。

而多路复用IO模式,经过一个线程就能够管理多个socket,只有当socket真正有读写事件发生才会占用资源来进行实际的读写操做。所以,多路复用IO比较适合链接数比较多的状况。

另外多路复用IO为什么比非阻塞IO模型的效率高是由于在非阻塞IO中,不断地询问socket状态时经过用户线程去进行的,而在多路复用IO中,轮询每一个socket状态是内核在进行的,这个效率要比用户线程要高的多。

不过要注意的是,多路复用IO模型是经过轮询的方式来检测是否有事件到达,而且对到达的事件逐一进行响应。所以对于多路复用IO模型来讲,一旦事件响应体很大,那么就会致使后续的事件迟迟得不处处理,而且会影响新的事件轮询。

 

4.信号驱动IO模型

在信号驱动IO模型中,当用户线程发起一个IO请求操做,会给对应的socket注册一个信号函数,而后用户线程会继续执行,当内核数据就绪时会发送一个信号给用户线程,用户线程接收到信号以后,便在信号函数中调用IO读写操做来进行实际的IO请求操做。

5.异步IO模型

异步IO模型才是最理想的IO模型,在异步IO模型中,当用户线程发起read操做以后,马上就能够开始去作其它的事。

而另外一方面,从内核的角度,当它受到一个asynchronous read以后,它会马上返回,说明read请求已经成功发起了,所以不会对用户线程产生任何block。

而后,内核会等待数据准备完成,而后将数据拷贝到用户线程,当这一切都完成以后,内核会给用户线程发送一个信号,告诉它read操做完成了。

也就说用户线程彻底不须要实际的整个IO操做是如何进行的,只须要先发起一个请求,当接收内核返回的成功信号时表示IO操做已经完成,能够直接去使用数据了。

也就说在异步IO模型中,IO操做的两个阶段都不会阻塞用户线程,这两个阶段都是由内核自动完成,而后发送一个信号告知用户线程操做已完成。

用户线程中不须要再次调用IO函数进行具体的读写。

这点是和信号驱动模型有所不一样的

在信号驱动模型中,当用户线程接收到信号表示数据已经就绪,而后须要用户线程调用IO函数进行实际的读写操做;而在异步IO模型中,收到信号表示IO操做已经完成,不须要再在用户线程中调用iO函数进行实际的读写操做。

注意,异步IO是须要操做系统的底层支持,在Java 7中,提供了Asynchronous IO。也就是java中的AIO

 

前面四种IO模型实际上都属于同步IO,只有最后一种是真正的异步IO,由于不管是多路复用IO仍是信号驱动模型,IO操做的第2个阶段都会引发用户线程阻塞,也就是内核进行数据拷贝的过程都会让用户线程阻塞。

八、 Reactor和Proactor IO设计模式是什么?

在传统的网络服务设计模式中,有两种比较经典的模式:一种是 多线程,一种是线程池。

对于多线程模式,也就说来了client,服务器就会新建一个线程来处理该client的读写事件,以下图所示:

 

这种模式虽然处理起来简单方便,可是因为服务器为每一个client的链接都采用一个线程去处理,使得资源占用很是大。所以,当链接数量达到上限时,再有用户请求链接,直接会致使资源瓶颈,严重的可能会直接致使服务器崩溃。

 

所以,为了解决这种一个线程对应一个客户端模式带来的问题提出了采用线程池的方式,也就说建立一个固定大小的线程池,来一个客户端,就从线程池取一个空闲线程来处理,当客户端处理完读写操做以后,就交出对线程的占用。所以这样就避免为每个客户端都要建立线程带来的资源浪费,使得线程能够重用。

可是线程池也有它的弊端,若是链接大可能是长链接,所以可能会致使在一段时间内,线程池中的线程都被占用,那么当再有用户请求链接时,因为没有可用的空闲线程来处理,就会致使客户端链接失败,从而影响用户体验。所以,线程池比较适合大量的短链接应用。

所以便出现了下面的两种高性能IO设计模式:Reactor和Proactor。

 

Reactor模式中,会先对每一个client注册感兴趣的事件,而后有一个线程专门去轮询每一个client是否有事件发生,当有事件发生时,便顺序处理每一个事件,当全部事件处理完以后,便再转去继续轮询,以下图所示:

 

多路复用IO就是采用Reactor模式。注意,上面的图中展现的 是顺序处理每一个事件,固然为了提升事件处理速度,能够经过多线程或者线程池的方式来处理事件。

 

Proactor模式中,当检测到有事件发生时,会新起一个异步操做,而后交由内核线程去处理,当内核线程完成IO操做以后,发送一个通知告知操做已完成,能够得知,异步IO模型采用的就是Proactor模式。

9、Java NIO 中的Buffer是什么?如何使用?

Buffer(缓冲区):

Java NIO Buffers用于和NIO Channel交互。 咱们从Channel中读取数据到buffers里,从Buffer把数据写入到Channels;

Buffer本质上就是一块内存区;

一个Buffer有三个属性是必须掌握的,分别是:capacity容量、position位置、limit限制。

Buffer的常见方法

Buffer clear()

Buffer flip()

Buffer rewind()

Buffer position(int newPosition)

Buffer的使用方式/方法介绍:

分配缓冲区(Allocating a Buffer):

ByteBuffer buf = ByteBuffer.allocate(28);//以ByteBuffer为例子

写入数据到缓冲区(Writing Data to a Buffer)

写数据到Buffer有两种方法:

1.从Channel中写数据到Buffer

int bytesRead = inChannel.read(buf); //read into buffer.

2.经过put写数据:

buf.put(127);

十、Nio buffer 的内部结构是什么?

 

一个 buffer 主要由 position,limit,capacity 三个变量来控制读写的过程。此三个变量的含义见以下表格:

参数

写模式   

读模式

position

当前写入的单位数据数量。

当前读取的单位数据位置。

limit

表明最多能写多少单位数据和容量是同样的。

表明最多能读多少单位数据,和以前写入的单位数据量一致。

capacity

buffer 容量

buffer 容量

Buffer 常见方法:

flip(): 写模式转换成读模式

rewind() :将 position 重置为 0 ,通常用于重复读。

clear() :清空 buffer ,准备再次被写入 (position 变成 0 , limit 变成 capacity) 。

compact(): 将未读取的数据拷贝到 buffer 的头部位。

mark() 、 reset():mark 能够标记一个位置, reset 能够重置到该位置。

Buffer 常见类型: ByteBuffer 、 MappedByteBuffer 、 CharBuffer 、 DoubleBuffer 、 FloatBuffer 、 IntBuffer 、LongBuffer 、 ShortBuffer 。

channel 常见类型 :FileChannel 、 DatagramChannel(UDP) 、 SocketChannel(TCP) 、 ServerSocketChannel(TCP)

11、Java NIO 中的 Channel是什么?有什么特色?

Channel

Java NIO中的SocketChannel是一个链接到TCP网络套接字的通道。

能够经过如下2种方式建立SocketChannel:

  1. 打开一个SocketChannel并链接到互联网上的某台服务器。
  2. 一个新链接到达ServerSocketChannel时,会建立一个SocketChannel。

打开 SocketChannel  下面是SocketChannel的打开方式:  

SocketChannel socketChannel = SocketChannel.open();

socketChannel.connect(new InetSocketAddress("http://jenkov.com", 80));

关闭 SocketChannel  

当用完SocketChannel以后调用SocketChannel.close()关闭SocketChannel:   socketChannel.close();

从 SocketChannel 读取数据  

要从SocketChannel中读取数据,调用一个read()的方法之一。

ByteBuffer buf = ByteBuffer.allocate(48);

int bytesRead = socketChannel.read(buf);

非阻塞模式

能够设置 SocketChannel 为非阻塞模式(non-blocking mode).设置以后,就能够在异步模式下调用connect(), read() 和write()了。

若是SocketChannel在非阻塞模式下,此时调用connect(),该方法可能在链接创建以前就返回了。为了肯定链接是否创建,能够调用finishConnect()的方法。

像这样:

socketChannel.configureBlocking(false);

socketChannel.connect(new InetSocketAddress("http://jenkov.com", 80));

 

while(! socketChannel.finishConnect() ){

    //wait, or do something else...

}

Java NIO Channel通道和流很是类似,主要有如下几点区别:

l 通道能够读也能够写,流通常来讲是单向的(只能读或者写,因此以前咱们用流进行IO操做的时候须要分别建立一个输入流和一个输出流)。

l 通道能够异步读写。

l 通道老是基于缓冲区Buffer来读写。

Java NIO中最重要的几个Channel的实现:

l FileChannel: 用于文件的数据读写

l DatagramChannel: 用于UDP的数据读写

l SocketChannel: 用于TCP的数据读写,通常是客户端实现

l ServerSocketChannel: 容许咱们监听TCP连接请求,每一个请求会建立会一个SocketChannel,通常是服务器实现

类层次结构

 

12、Java NIO中的Selector是什么?

Selector(选择器):

Selector 通常称 为选择器 ,固然你也能够翻译为 多路复用器 。

它是Java NIO核心组件中的一个,用于检查一个或多个NIO Channel(通道)的状态是否处于可读、可写。

如此能够实现单线程管理多个channels,也就是能够管理多个网络连接。

使用Selector的好处在于: 使用更少的线程来就能够来处理通道了, 相比使用多个线程,避免了线程上下文切换带来的开销。

Selector(选择器)的使用方法介绍

Selector的建立

Selector selector = Selector.open();

注册Channel到Selector(Channel必须是非阻塞的)

channel.configureBlocking(false);

SelectionKey key = channel.register(selector, Selectionkey.OP_READ);

SelectionKey介绍

一个SelectionKey键表示了一个特定的通道对象和一个特定的选择器对象之间的注册关系。

从Selector中选择channel(Selecting Channels via a Selector)

选择器维护注册过的通道的集合,而且这种注册关系都被封装在SelectionKey当中.

中止选择的方法

wakeup()方法 和close()方法。

13、简单讲一下文件IO中的Path和Files

文件I/O基石:Path:

建立一个Path

File和Path之间的转换,File和URI之间的转换

获取Path的相关信息

移除Path中的冗余项

Files类:

Files.exists() 检测文件路径是否存在

Files.createFile() 建立文件

Files.createDirectories()和Files.createDirectory()建立文件夹

Files.delete()方法 能够删除一个文件或目录

Files.copy()方法能够吧一个文件从一个地址复制到另外一个位置

获取文件属性

遍历一个文件夹

Files.walkFileTree()遍历整个目录

 

1四、select、poll和epoll的区别

在linux 没有实现epoll事件驱动机制以前,咱们通常选择用select或者poll等IO多路复用的方法来实现并发服务程序。在大数据、高并发、集群等一些名词唱得火热之年代,select和poll的用武之地愈来愈有限,风头已经被epoll占尽。

select的缺点:

  1. 单个进程可以监视的文件描述符的数量存在最大限制,一般是1024,固然能够更改数量,但因为select采用轮询的方式扫描文件描述符,文件描述符数量越多,性能越差;

在linux内核头文件中,有这样的定义:

#define __FD_SETSIZE    1024

  1. 内核 / 用户空间内存拷贝问题,select须要复制大量的句柄数据结构,产生巨大的开销;
  2. select返回的是含有整个句柄的数组,应用程序须要遍历整个数组才能发现哪些句柄发生了事件;
  3. select的触发方式是水平触发,应用程序若是没有完成对一个已经就绪的文件描述符进行IO操做,那么以后每次select调用仍是会将这些文件描述符通知进程。

相比select模型,poll使用链表保存文件描述符,所以没有了监视文件数量的限制,但其余三个缺点依然存在。

 

拿select模型为例,假设咱们的服务器须要支持100万的并发链接,则在__FD_SETSIZE 为1024的状况下,则咱们至少须要开辟1k个进程才能实现100万的并发链接。

除了进程间上下文切换的时间消耗外,从内核/用户空间大量的无脑内存拷贝、数组轮询等,是系统难以承受的。

所以,基于select模型的服务器程序,要达到10万级别的并发访问,是一个很难完成的任务。

 

epoll的实现机制与select/poll机制彻底不一样,上面所说的 select的缺点在epoll上不复存在。

设想一下以下场景:

有100万个客户端同时与一个服务器进程保持着TCP链接。而每一时刻,一般只有几百上千个TCP链接是活跃的(事实上大部分场景都是这种状况)。如何实现这样的高并发?

 

在select/poll时代,服务器进程每次都把这100万个链接告诉操做系统(从用户态复制句柄数据结构到内核态),让操做系统内核去查询这些套接字上是否有事件发生,轮询完后,再将句柄数据复制到用户态,让服务器应用程序轮询处理已发生的网络事件,这一过程资源消耗较大,所以,select/poll通常只能处理几千的并发链接。

 

epoll的设计和实现与select彻底不一样。

epoll经过在Linux内核中申请一个简易的文件系统

(文件系统通常用什么数据结构实现?B+树)

把原先的select/poll调用分红了3个部分:

1)调用epoll_create()创建一个epoll对象(在epoll文件系统中为这个句柄对象分配资源)

2)调用epoll_ctl向epoll对象中添加这100万个链接的套接字

3)调用epoll_wait收集发生的事件的链接

 

如此一来,要实现上面说是的场景,只须要在进程启动时创建一个epoll对象,而后在须要的时候向这个epoll对象中添加或者删除链接。同时,epoll_wait的效率也很是高,由于调用epoll_wait时,并无一股脑的向操做系统复制这100万个链接的句柄数据,内核也不须要去遍历所有的链接。

 

下面来看看Linux内核具体的epoll机制实现思路。

 

当某一进程调用epoll_create方法时,Linux内核会建立一个eventpoll结构体,这个结构体中有两个成员与epoll的使用方式密切相关。eventpoll结构体以下所示:

struct eventpoll{    

....    

/*红黑树的根节点,这颗树中存储着全部添加到epoll中的须要监控的事件*/    

struct rb_root  rbr;

/*双链表中则存放着将要经过epoll_wait返回给用户的知足条件的事件*/   

struct list_head rdlist;  

  ....

};

每个epoll对象都有一个独立的eventpoll结构体,用于存放经过epoll_ctl方法向epoll对象中添加进来的事件。这些事件都会挂载在红黑树中,如此,重复添加的事件就能够经过红黑树而高效的识别出来(红黑树的插入时间效率是lgn,其中n为树的高度)。

全部添加到epoll中的事件都会与设备(网卡)驱动程序创建回调关系,也就是说,当相应的事件发生时会调用这个回调方法。这个回调方法在内核中叫ep_poll_callback,它会将发生的事件添加到rdlist双链表中。

在epoll中,对于每个事件,都会创建一个epitem结构体,以下所示:

struct epitem{    

struct rb_node  rbn;//红黑树节点    

struct list_head    rdllink;//双向链表节点    

struct epoll_filefd  ffd;  //事件句柄信息    

struct eventpoll *ep;    //指向其所属的eventpoll对象    

struct epoll_event event; //期待发生的事件类型

}

当调用epoll_wait检查是否有事件发生时,只须要检查eventpoll对象中的rdlist双链表中是否有epitem元素便可。若是rdlist不为空,则把发生的事件复制到用户态,同时将事件数量返回给用户。

 

经过红黑树和双链表数据结构,并结合操做系统底层回调机制,造就了epoll的高效

epoll的用法

第一步:epoll_create()系统调用。此调用返回一个句柄,以后全部的使用都依靠这个句柄来标识。

第二步:epoll_ctl()系统调用。经过此调用向epoll对象中添加、删除、修改感兴趣的事件,返回0标识成功,返回-1表示失败。

第三部:epoll_wait()系统调用。经过此调用收集收集在epoll监控中已经发生的事件。

1五、网络编程中设计并发服务器,使用多进程 与 多线程 ,请问有什么区别? 

1,进程:

子进程是父进程的复制品。

子进程得到父进程数据空间、堆和栈的复制品。
2,线程:

相对与进程而言,线程是一个更加接近与执行体的概念,它能够与同进程的其余线程共享数据,但拥有本身的栈空间,拥有独立的执行序列。

二者均可以提升程序的并发度,提升程序运行效率和响应时间。
线程和进程在使用上各有优缺点:

线程执行开销小,但不利于资源管理和保护;而进程正相反。

同时,线程适合于在SMP机器上运行,而进程则能够跨机器迁移。

SMP的全称是"对称多处理"(Symmetrical Multi-Processing)技术,是指在一个计算机上聚集了一组处理器(多CPU),各CPU之间共享内存子系统以及总线结构。

 

 

1五、网络编程的通常步骤

对于TCP链接:

1.服务器端

1)建立套接字create;

2)绑定端口号bind;

3)监听链接listen;

4)接受链接请求accept,并返回新的套接字;

5)用新返回的套接字recv/send;

6)关闭套接字。

2.客户端

1)建立套接字create;

2)发起创建链接请求connect;

3)发送/接收数据send/recv;

4)关闭套接字。

TCP总结:

Server端:create – bind – listen–  accept–  recv/send– close

Client端:create——- conncet——send/recv——close.

 

对于UDP链接:

1.服务器端:

1)建立套接字create;

2)绑定端口号bind;

3)接收/发送消息recvfrom/sendto;

4)关闭套接字。

2.客户端:

1)建立套接字create;

2)发送/接收消息sendto/recvfrom;

3)关闭套接字.

UDP总结:

Server端:create—-bind —-recvfrom/sendto—-close

Client端:create—-  sendto/recvfrom—-close.

函数原型int recv( _In_ SOCKET s, _Out_ char *buf, _In_ int len, _In_ int flags);

 

16、TCP的全称是?

        Transfer Control Protocol。

17、UDP的全称是?

        User Datagram Protocol。

18、请说出TCP和UDP的区别?

TCP:

一种面向链接(链接导向)的、可靠的、基于字节流的传输层(Transport layer)通讯协议 。

特色:

面向链接;

点到点的通讯;

高可靠性;

占用系统资源多、效率低;

 

UDP:

一种无链接的、提供面向事务的简单不可靠信息传送服务的传输层通讯协议。

特色:

非面向链接

传输不可靠,可能丢失

发送无论对方是否准备好,接收方收到也不确认

能够广播发送

很是简单的协议,开销小

 

 TCP—传输控制协议,提供的是面向链接、可靠的字节流服务。当客户和服务器彼此交换数据前,必须先在双方之间创建一个TCP链接,以后才能传输数据。TCP提供超时重发,丢弃重复数据,检验数据,流量控制等功能,保证数据能从一端传到另外一端。

UDP—用户数据报协议,是一个简单的面向数据报的运输层协议。UDP不提供可靠性,它只是把应用程序传给IP层的数据报发送出去,可是并不能保证它们能到达目的地。因为UDP在传输数据报前不用在客户和服务器之间创建一个链接,且没有超时重发等机制,故而传输速度很快

 

19TCP为何不是两次链接?而是三次握手?

若是A与B两个进程通讯,若是仅是两次链接。

可能出现的一种状况

就是:A发送完请求报文之后,因为网络状况很差,出现了网络拥塞,即B延时很长时间后收到报文,即此时A将此报文认定为失效的报文。

B收到报文后,会向A发起链接。此时两次握手完毕

B会认为已经创建了链接能够通讯,B会一直等到A发送的链接请求

而A对失效的报文回复天然不会处理。

所以会陷入B忙等的僵局,形成资源的浪费。

20、说明socket是什么?

 

从上图能够看到:底层的东西已经被内核实现了,即咱们一般意义上的内核协议栈(传输层,网络层,链路层)

最上面的Application(应用层)是咱们用户所要实现的,它是属于用户进程的一部分,工做在用户空间,那么用户空间的程序要想访问内核,使用内核的服务,就须要一个接口,去访问所须要的服务

对于网络编程来讲,这个接口就是套接口(Socket)。

       Socket:能够看做用户进程和内核网络协议栈编程(交互)接口

       Socket:不只能够在同一台主机上进行通讯,也能够在网络上不一样的主机间进行通讯,也能够异构(软硬件平台不一样)进行通讯(手机qq和PC机上的qq进行通讯,手机的系统是ARM,而PC机是x86)

21、为何须要端口?端口是真实存在的仍是虚拟的概念? 

IP地址用来标志一台计算机,可是一台计算机上可能提供多种网络应用程序,使用端口来区分这些应用程序。

端口是虚拟的概念,并非说在主机上真的有若干个端口。经过端口,能够在一个主机上运行多个网络应用程序。

端口范围0---65535,16位整数。

22、Java中,端口使用两个字节表示,能够表示多少个端口? UDP和TCP端口是各自独立的吗?

端口范围0---65535,16位整数。

因为TCP/IP传输层的两个协议TCP和UDP是彻底独立的两个软件模块,所以各自的端口号也相互独立,如TCP有一个255号端口,UDP也能够有一个255号端口,两者并不冲突。 

 

23、URL类有什么做用?

URL:Uniform Resource Locator,统一资源定位器;俗称“网址”,如:

"http://www.baidu.com:80/index.html#aa?cansu=bjsxt“

由4部分组成:

l 协议: http;

l 存放资源的主机域名:www.baidu.com;

l 端口号:80;

l 资源文件名: index.html#aa?cansu=bjsxt;

 

URL是指向互联网“资源”的指针。资源能够是简单的文件或目录,也能够是对更为复杂的对象的引用,例如对数据库或搜索引擎的查询。

24、基于TCP的Socket网络编程的主要步骤是什么?

 

基于TCP协议的Socket编程的主要步骤

服务器端(server):

1. 构建一个ServerSocket实例,指定本地的端口。这个socket就是用来监听指定端口的链接请求的。

2.重复以下几个步骤:

a. 调用socket的accept()方法来得到下面客户端的链接请求。经过accept()方法返回的socket实例,创建了一个和客户端的新链接。

b.经过这个返回的socket实例获取InputStream和OutputStream,能够经过这两个stream来分别读和写数据。

c.结束的时候调用socket实例的close()方法关闭socket链接。

 

客户端(client):

1.构建Socket实例,经过指定的远程服务器地址和端口来创建链接。

2.经过Socket实例包含的InputStream和OutputStream来进行数据的读写。

3.操做结束后调用socket实例的close方法,关闭。

 

25、【上机】写出创建TCP服务器ServerSocket的代码。并说明accept方法有什么特色?

//服务器监听请求;

ServerSocket ss=new ServerSocket(9999);

//接受请求:建立了socket;

Socket socket=ss.accept();

        详见课上示例。

26、【上机】写出创建TCP客户端Socket的代码。并说明创建Socket后,经过什么方法Socket得到流对象?

//客户端向服务器端发送请求;

Socket socket=new Socket("127.0.0.1",9999);

//建好链接后,开始传输数据;

OutputStream os=socket.getOutputStream();

 

        详见课上示例。

27、基于UDP的Socket网络编程的主要步骤是什么?

基于UDP协议的Socket编程的主要步骤

服务器端(server):

1. 构造DatagramSocket实例,指定本地端口。

2. 经过DatagramSocket实例的receive方法接收DatagramPacket.DatagramPacket中间就包含了通讯的内容。

3. 经过DatagramSocket的send和receive方法来收和发DatagramPacket.

客户端(client):

1. 构造DatagramSocket实例。

2.经过DatagramSocket实例的send和receive方法发送DatagramPacket报文。

3.结束后,调用DatagramSocket的close方法关闭。

 

28、【上机】使用UDP的方式,完成对象的传递。

(1)客户端向服务器端传送对象信息;

DatagramSocket ds=new DatagramSocket(9999);

         //构建数据包;

        Scanner input=new Scanner(System.in);

        System.out.println("请输入用户名:");

        String username=input.nextLine();

        System.out.println("请输入密码:");

        String password=input.nextLine();

 //事先要建立好User类;

        User user=new User(username,password);

        //字节流;在内存开辟缓冲区;

        ByteArrayOutputStream baos=new ByteArrayOutputStream();

        ObjectOutputStream oos=new ObjectOutputStream(baos);

        oos.writeObject(user);

 

        byte buf[]=baos.toByteArray();

        DatagramPacket dp=new DatagramPacket(buf, buf.length, InetAddress.getByName("127.0.0.1"), 8888);//DatagramPacket只用byte[]数组;

             //发送数据;

        ds.send(dp);

 

(2)服务器端从客户端接收对象信息;

//服务器定义DatagramSocket以接收数据;

DatagramSocket ds=new DatagramSocket(8888);

 

//定义一个数据包来接收数据;

//数据包里是byte数组,因此还得定义一个byte数组;

byte buf[]=new byte[1024];

DatagramPacket dp=new DatagramPacket(buf, buf.length);

         //接收客户端发过来的数据;

ds.receive(dp);

 

        //用字节流和对象流读取对象信息;

ByteArrayInputStream bais=new ByteArrayInputStream(buf);

ObjectInputStream ois=new ObjectInputStream(bais);

 

User user=(User)ois.readObject();

        System.out.println(user);

 

详见课上示例。

29、HTTPClient相关问题

  1. 什么是httpClient?
  2. 什么是HttpClient不能作的?
  3. HttpClient有哪些特性?
  4. HttpClient怎样发送带参数的GET请求?
  5. HttpClient怎样发送带参数的POST请求?
  6. HttpClient怎样获取响应状态?
  7. HttpClient怎样获取响应内容?
  8. HttpClient怎样上传文件?

30NIO 和传统 BIO区别是什么? 

 NIO vs BIO之间的理念上面的区别(NIO将阻塞交给了后台线程执行)

IO是面向流的,NIO是面向缓冲区的

Java BIO面向流意味着每次从流中读一个或多个字节,直至读取全部字节,它们没有被缓存在任何地方;

NIO则能先后移动流中的数据,由于是面向缓冲区的 BIO流是阻塞的,NIO流是不阻塞的 Java IO的各类流是阻塞的。

这意味着,当一个线程调用read() 或 write()时,该线程被阻塞,直到有一些数据被读取,或数据彻底写入。

该线程在此期间不能再干任何事情了 Java NIO的非阻塞模式,使一个线程从某通道发送请求读取数据,可是它仅能获得目前可用的数据,若是目前没有数据可用时,就什么都不会获取。

NIO可以让您只使用一个(或几个)单线程管理多个通道(网络链接或文件),但付出的代价是解析数据可能会比从一个阻塞流中读取数据更复杂。 

非阻塞写也是如此。一个线程请求写入一些数据到某通道,但不须要等待它彻底写入,这个线程同时能够去作别的事情。

选择器

Java NIO的选择器容许一个单独的线程来监视多个输入通道,你能够注册多个通道使用一个选择器,而后使用一个单独的线程来“选择”通道:这些通道里已经有能够处理的输入,或者选择已准备写入的通道。这种选择机制,使得一个单独的线程很容易来管理多个通道。

 

31Java NIO 几个核心组成部分是什么?做用分别是什么?

l Channels

l Buffers

l Selectors

基本上,全部的 IO 在NIO 中都从一个Channel 开始。

Channel 有点象流。

数据能够从Channel读到Buffer中,也能够从Buffer 写到Channel中。

Channel的实现: 

(涵盖了UDP 和 TCP 网络IO,以及文件IO)  

l FileChannel

l DatagramChannel

l SocketChannel

l ServerSocketChannel

读数据:  

int bytesRead = inChannel.read(buf);

写数据:  

int bytesWritten = inChannel.write(buf);  

 

Buffer  

Buffer实现: (byte,  char、short, int, long, float, double )  

l ByteBuffer

l CharBuffer

l DoubleBuffer

l FloatBuffer

l IntBuffer

l LongBuffer

l ShortBuffer

Buffer使用  

l 读数据 flip()方法:

buf.flip();  

将Buffer从写模式切换到读模式 调用flip()方法会将position设回0,并将limit设置成以前position的值。

l (char) buf.get()

读取数据

l Buffer.rewind()

将position设回0,因此你能够重读Buffer中的全部数据 limit保持不变,仍然表示能从Buffer中读取多少个元素(byte、char等)

l Buffer.mark()方法,

能够标记Buffer中的一个特定position。

以后能够经过调用 Buffer.reset()方法,恢复到Buffer.mark()标记时的position

一旦读完了全部的数据,就须要清空缓冲区,让它能够再次被写入。

l clear()方法:

清空整个缓冲区。 position将被设回0,limit被设置成 capacity的值

l compact()方法:

 只会清除已经读过的数据;任何未读的数据都被移到缓冲区的起始处,新写入的数据将放到缓冲区未读数据的后面。

将position设到最后一个未读元素正后面,limit被设置成 capacity的值 写数据 buf.put(127);    

Buffer的三个属性  

capacity:

l 表示容量

l Buffer的一个固定的大小值;

l Buffer满了须要将其清空才能再写;

l ByteBuffer.allocate(48);该buffer的capacity为48byte CharBuffer.allocate(1024);该buffer的capacity为1024个char 

position:

含义取决于Buffer处在读模式仍是写模式(初始值为0,写或者读操做的当前位置)

写数据时,初始的position值为0;

其值最大可为capacity-1

将Buffer从写模式切换到读模式,position会被重置为0

limit:

含义取决于Buffer处在读模式仍是写模式(写limit=capacity;读limit等于最多能够读取到的数据)

写模式下,limit等于Buffer的capacity 切换Buffer到读模式时, limit表示你最多能读到多少数据;  

Selector  

Selector容许单线程处理多个 Channel。

若是你的应用打开了多个链接(通道),但每一个链接的流量都很低,使用Selector就会很方便。

例如,在一个聊天服务器中。    

要使用Selector,得向Selector注册Channel,而后调用它的select()方法。这个方法会一直阻塞到某个注册的通道有事件就绪。

一旦这个方法返回,线程就能够处理这些事件,事件的例子有如新链接进来,数据接收等。 

使用  

建立:

Selector selector = Selector.open();   注册通道: channel.configureBlocking(false);   //与Selector一块儿使用时,Channel必须处于非阻塞模式 

//这意味着不能将FileChannel与Selector一块儿使用,由于FileChannel不能切换到非阻塞模式(而套接字通道均可以)

SelectionKey key = channel.register(selector, Selectionkey.OP_READ);  //第二个参数代表Selector监听Channel时对什么事件感兴趣

//SelectionKey.OP_CONNECT  SelectionKey.OP_ACCEPT  SelectionKey.OP_READ SelectionKey.OP_WRITE //能够用或操做符将多个兴趣组合一块儿

SelectionKey 包含了interest集合 、ready集合 、Channel 、Selector 、附加的对象(可选)

int interestSet = key.interestOps();

能够进行相似interestSet & SelectionKey.OP_CONNECT的判断

select():

阻塞到至少有一个通道在你注册的事件上就绪了

selectNow():

不会阻塞,无论什么通道就绪都马上返回

selectedKeys():

访问“已选择键集(selected key set)”中的就绪通道

close():

使用完selector须要用其close()方法会关闭该Selector,且使注册到该Selector上的全部SelectionKey实例无效  

Set selectedKeys = selector.selectedKeys();  

Iterator keyIterator = selectedKeys.iterator();  

while(keyIterator.hasNext()) {       

SelectionKey key = keyIterator.next();       

if(key.isAcceptable()) {           

// a connection was accepted by a ServerSocketChannel.       

} else if (key.isConnectable()) {          

 // a connection was established with a remote server.       

} else if (key.isReadable()) {          

 // a channel is ready for reading       

} else if (key.isWritable()) {           

// a channel is ready for writing       

}     

keyIterator.remove();//注意这里必须手动remove;

代表该selectkey我已经处理过了;

}

 

32、简单说一下http协议?

HTTP协议是Hyper Text Transfer Protocol(超文本传输协议)的缩写,是用于从万维网(WWW:World Wide Web )服务器传输超文本到本地浏览器的传送协议。

HTTP是一个基于TCP/IP通讯协议来传递数据(HTML 文件, 图片文件, 查询结果等)。

HTTP 工做原理

HTTP协议工做于客户端-服务端架构上。浏览器做为HTTP客户端经过URL向HTTP服务端即WEB服务器发送全部请求。

Web服务器有:Apache服务器,Nginx,IIS服务器(Internet Information Services)等。

Web服务器根据接收到的请求后,向客户端发送响应信息。

HTTP默认端口号为80,可是你也能够改成8080或者其余端口。

HTTP三点注意事项:

l HTTP是无链接:无链接的含义是限制每次链接只处理一个请求。服务器处理完客户的请求,并收到客户的应答后,即断开链接。采用这种方式能够节省传输时间。

l HTTP是媒体独立的:这意味着,只要客户端和服务器知道如何处理的数据内容,任何类型的数据均可以经过HTTP发送。客户端以及服务器指定使用适合的MIME-type内容类型。

l HTTP是无状态:HTTP协议是无状态协议。无状态是指协议对于事务处理没有记忆能力。缺乏状态意味着若是后续处理须要前面的信息,则它必须重传,这样可能致使每次链接传送的数据量增大。另外一方面,在服务器不须要先前信息时它的应答就较快。

 

 

33、http协议下客户端请求报文是什么?

客户端发送一个HTTP请求到服务器的请求消息包括如下格式:

l 请求行(request line)

l 请求头部(header)

l 空行

l 请求数据

四个部分组成

下图给出了请求报文的通常格式。

 

客户端请求:

GET /hello.txt HTTP/1.1

User-Agent: curl/7.16.3 libcurl/7.16.3 OpenSSL/0.9.7l zlib/1.2.3

Host: www.example.com

Accept-Language: en, mi

3四、描述一下http协议服务器响应报文有哪些?

HTTP响应也由四个部分组成,分别是:

l 状态行

l 消息报头

l 空行

l 响应正文

 

HTTP/1.1 200 OK

Date: Mon, 27 Jul 2009 12:28:53 GMT

Server: Apache

Last-Modified: Wed, 22 Jul 2009 19:15:56 GMT

ETag: "34aa387-d-1568eb00"

Accept-Ranges: bytes

Content-Length: 51

Vary: Accept-Encoding

Content-Type: text/plain

35HTTP协议中经常使用的请求方法有哪些

根据HTTP标准,HTTP请求可使用多种请求方法。

HTTP1.0定义了三种请求方法: GET, POST 和 HEAD方法。

HTTP1.1新增了五种请求方法:OPTIONS, PUT, DELETE, TRACE 和 CONNECT 方法。

序号

方法

描述

1

GET

请求指定的页面信息,并返回实体主体。

2

HEAD

相似于get请求,只不过返回的响应中没有具体的内容,用于获取报头

3

POST

向指定资源提交数据进行处理请求(例如提交表单或者上传文件)。数据被包含在请求体中。

POST请求可能会致使新的资源的创建和/或已有资源的修改。

4

PUT

从客户端向服务器传送的数据取代指定的文档的内容。

5

DELETE

请求服务器删除指定的页面。

6

CONNECT

HTTP/1.1协议中预留给可以将链接改成管道方式的代理服务器。

7

OPTIONS

容许客户端查看服务器的性能。

8

TRACE

回显服务器收到的请求,主要用于测试或诊断。

36、常见的HTTP状态码有哪些

当浏览者访问一个网页时,浏览者的浏览器会向网页所在服务器发出请求。当浏览器接收并显示网页前,此网页所在的服务器会返回一个包含HTTP状态码的信息头(server header)用以响应浏览器的请求。

HTTP状态码的英文为HTTP Status Code。

下面是常见的HTTP状态码:

l 200 - 请求成功

l 301 - 资源(网页等)被永久转移到其它URL

l 404 - 请求的资源(网页等)不存在

l 500 - 内部服务器错误

HTTP状态码由三个十进制数字组成,第一个十进制数字定义了状态码的类型,后两个数字没有分类的做用。HTTP状态码共分为5种类型:

HTTP状态码分类

分类

分类描述

1**

信息,服务器收到请求,须要请求者继续执行操做

2**

成功,操做被成功接收并处理

3**

重定向,须要进一步的操做以完成请求

4**

客户端错误,请求包含语法错误或没法完成请求

5**

服务器错误,服务器在处理请求的过程当中发生了错误

HTTP状态码列表:

HTTP状态码列表

状态码

状态码英文名称

中文描述

100

Continue

继续。客户端应继续其请求

101

Switching Protocols

切换协议。服务器根据客户端的请求切换协议。只能切换到更高级的协议,例如,切换到HTTP的新版本协议

 

200

OK

请求成功。通常用于GET与POST请求

201

Created

已建立。成功请求并建立了新的资源

202

Accepted

已接受。已经接受请求,但未处理完成

203

Non-Authoritative Information

非受权信息。请求成功。但返回的meta信息不在原始的服务器,而是一个副本

204

No Content

无内容。服务器成功处理,但未返回内容。在未更新网页的状况下,可确保浏览器继续显示当前文档

205

Reset Content

重置内容。服务器处理成功,用户终端(例如:浏览器)应重置文档视图。可经过此返回码清除浏览器的表单域

206

Partial Content

部份内容。服务器成功处理了部分GET请求

 

300

Multiple Choices

多种选择。请求的资源可包括多个位置,相应可返回一个资源特征与地址的列表用于用户终端(例如:浏览器)选择

301

Moved Permanently

永久移动。请求的资源已被永久的移动到新URI,返回信息会包括新的URI,浏览器会自动定向到新URI。从此任何新的请求都应使用新的URI代替

302

Found

临时移动。与301相似。但资源只是临时被移动。客户端应继续使用原有URI

303

See Other

查看其它地址。与301相似。使用GET和POST请求查看

304

Not Modified

未修改。所请求的资源未修改,服务器返回此状态码时,不会返回任何资源。客户端一般会缓存访问过的资源,经过提供一个头信息指出客户端但愿只返回在指定日期以后修改的资源

305

Use Proxy

使用代理。所请求的资源必须经过代理访问

306

Unused

已经被废弃的HTTP状态码

307

Temporary Redirect

临时重定向。与302相似。使用GET请求重定向

 

400

Bad Request

客户端请求的语法错误,服务器没法理解

401

Unauthorized

请求要求用户的身份认证

402

Payment Required

保留,未来使用

403

Forbidden

服务器理解请求客户端的请求,可是拒绝执行此请求

404

Not Found

服务器没法根据客户端的请求找到资源(网页)。经过此代码,网站设计人员可设置"您所请求的资源没法找到"的个性页面

405

Method Not Allowed

客户端请求中的方法被禁止

406

Not Acceptable

服务器没法根据客户端请求的内容特性完成请求

407

Proxy Authentication Required

请求要求代理的身份认证,与401相似,但请求者应当使用代理进行受权

408

Request Time-out

服务器等待客户端发送的请求时间过长,超时

409

Conflict

服务器完成客户端的PUT请求是可能返回此代码,服务器处理请求时发生了冲突

410

Gone

客户端请求的资源已经不存在。410不一样于404,若是资源之前有如今被永久删除了可以使用410代码,网站设计人员可经过301代码指定资源的新位置

411

Length Required

服务器没法处理客户端发送的不带Content-Length的请求信息

412

Precondition Failed

客户端请求信息的先决条件错误

413

Request Entity Too Large

因为请求的实体过大,服务器没法处理,所以拒绝请求。为防止客户端的连续请求,服务器可能会关闭链接。若是只是服务器暂时没法处理,则会包含一个Retry-After的响应信息

414

Request-URI Too Large

请求的URI过长(URI一般为网址),服务器没法处理

415

Unsupported Media Type

服务器没法处理请求附带的媒体格式

416

Requested range not satisfiable

客户端请求的范围无效

417

Expectation Failed

服务器没法知足Expect的请求头信息

 

500

Internal Server Error

服务器内部错误,没法完成请求

501

Not Implemented

服务器不支持请求的功能,没法完成请求

502

Bad Gateway

充当网关或代理的服务器,从远端服务器接收到了一个无效的请求

503

Service Unavailable

因为超载或系统维护,服务器暂时的没法处理客户端的请求。延时的长度可包含在服务器的Retry-After头信息中

504

Gateway Time-out

充当网关或代理的服务器,未及时从远端服务器获取请求

505

HTTP Version not supported

服务器不支持请求的HTTP协议的版本,没法完成处理

37HTTP 协议中content-type指的是什么?

Content-Type,内容类型,通常是指网页中存在的Content-Type,用于定义网络文件的类型和网页的编码,决定浏览器将以什么形式、什么编码读取这个文件,这就是常常看到一些Asp网页点击的结果倒是下载到的一个文件或一张图片的缘由。

 

文件扩展名

Content-Type(Mime-Type)

文件扩展名

Content-Type(Mime-Type)

.*( 二进制流,不知道下载文件类型)

application/octet-stream

.tif

image/tiff

.001

application/x-001

.301

application/x-301

.323

text/h323

.906

application/x-906

.907

drawing/907

.a11

application/x-a11

.acp

audio/x-mei-aac

.ai

application/postscript

.aif

audio/aiff

.aifc

audio/aiff

.aiff

audio/aiff

.anv

application/x-anv

.asa

text/asa

.asf

video/x-ms-asf

.asp

text/asp

.asx

video/x-ms-asf

.au

audio/basic

.avi

video/avi

.awf

application/vnd.adobe.workflow

.biz

text/xml

.bmp

application/x-bmp

.bot

application/x-bot

.c4t

application/x-c4t

.c90

application/x-c90

.cal

application/x-cals

.cat

application/vnd.ms-pki.seccat

.cdf

application/x-netcdf

.cdr

application/x-cdr

.cel

application/x-cel

.cer

application/x-x509-ca-cert

.cg4

application/x-g4

.cgm

application/x-cgm

.cit

application/x-cit

.class

java/*

.cml

text/xml

.cmp

application/x-cmp

.cmx

application/x-cmx

.cot

application/x-cot

.crl

application/pkix-crl

.crt

application/x-x509-ca-cert

.csi

application/x-csi

.css

text/css

.cut

application/x-cut

.dbf

application/x-dbf

.dbm

application/x-dbm

.dbx

application/x-dbx

.dcd

text/xml

.dcx

application/x-dcx

.der

application/x-x509-ca-cert

.dgn

application/x-dgn

.dib

application/x-dib

.dll

application/x-msdownload

.doc

application/msword

.dot

application/msword

.drw

application/x-drw

.dtd

text/xml

.dwf

Model/vnd.dwf

.dwf

application/x-dwf

.dwg

application/x-dwg

.dxb

application/x-dxb

.dxf

application/x-dxf

.edn

application/vnd.adobe.edn

.emf

application/x-emf

.eml

message/rfc822

.ent

text/xml

.epi

application/x-epi

.eps

application/x-ps

.eps

application/postscript

.etd

application/x-ebx

.exe

application/x-msdownload

.fax

image/fax

.fdf

application/vnd.fdf

.fif

application/fractals

.fo

text/xml

.frm

application/x-frm

.g4

application/x-g4

.gbr

application/x-gbr

.

application/x-

.gif

image/gif

.gl2

application/x-gl2

.gp4

application/x-gp4

.hgl

application/x-hgl

.hmr

application/x-hmr

.hpg

application/x-hpgl

.hpl

application/x-hpl

.hqx

application/mac-binhex40

.hrf

application/x-hrf

.hta

application/hta

.htc

text/x-component

.htm

text/html

.html

text/html

.htt

text/webviewhtml

.htx

text/html

.icb

application/x-icb

.ico

image/x-icon

.ico

application/x-ico

.iff

application/x-iff

.ig4

application/x-g4

.igs

application/x-igs

.iii

application/x-iphone

.img

application/x-img

.ins

application/x-internet-signup

.isp

application/x-internet-signup

.IVF

video/x-ivf

.java

java/*

.jfif

image/jpeg

.jpe

image/jpeg

.jpe

application/x-jpe

.jpeg

image/jpeg

.jpg

image/jpeg

.jpg

application/x-jpg

.js

application/x-javascript

.jsp

text/html

.la1

audio/x-liquid-file

.lar

application/x-laplayer-reg

.latex

application/x-latex

.lavs

audio/x-liquid-secure

.lbm

application/x-lbm

.lmsff

audio/x-la-lms

.ls

application/x-javascript

.ltr

application/x-ltr

.m1v

video/x-mpeg

.m2v

video/x-mpeg

.m3u

audio/mpegurl

.m4e

video/mpeg4

.mac

application/x-mac

.man

application/x-troff-man

.math

text/xml

.mdb

application/msaccess

.mdb

application/x-mdb

.mfp

application/x-shockwave-flash

.mht

message/rfc822

.mhtml

message/rfc822

.mi

application/x-mi

.mid

audio/mid

.midi

audio/mid

.mil

application/x-mil

.mml

text/xml

.mnd

audio/x-musicnet-download

.mns

audio/x-musicnet-stream

.mocha

application/x-javascript

.movie

video/x-sgi-movie

.mp1

audio/mp1

.mp2

audio/mp2

.mp2v

video/mpeg

.mp3

audio/mp3

.mp4

video/mpeg4

.mpa

video/x-mpg

.mpd

application/vnd.ms-project

.mpe

video/x-mpeg

.mpeg

video/mpg

.mpg

video/mpg

.mpga

audio/rn-mpeg

.mpp

application/vnd.ms-project

.mps

video/x-mpeg

.mpt

application/vnd.ms-project

.mpv

video/mpg

.mpv2

video/mpeg

.mpw

application/vnd.ms-project

.mpx

application/vnd.ms-project

.mtx

text/xml

.mxp

application/x-mmxp

.net

image/pnetvue

.nrf

application/x-nrf

.nws

message/rfc822

.odc

text/x-ms-odc

.out

application/x-out

.p10

application/pkcs10

.p12

application/x-pkcs12

.p7b

application/x-pkcs7-certificates

.p7c

application/pkcs7-mime

.p7m

application/pkcs7-mime

.p7r

application/x-pkcs7-certreqresp

.p7s

application/pkcs7-signature

.pc5

application/x-pc5

.pci

application/x-pci

.pcl

application/x-pcl

.pcx

application/x-pcx

.pdf

application/pdf

.pdf

application/pdf

.pdx

application/vnd.adobe.pdx

.pfx

application/x-pkcs12

.pgl

application/x-pgl

.pic

application/x-pic

.pko

application/vnd.ms-pki.pko

.pl

application/x-perl

.plg

text/html

.pls

audio/scpls

.plt

application/x-plt

.png

image/png

.png

application/x-png

.pot

application/vnd.ms-powerpoint

.ppa

application/vnd.ms-powerpoint

.ppm

application/x-ppm

.pps

application/vnd.ms-powerpoint

.ppt

application/vnd.ms-powerpoint

.ppt

application/x-ppt

.pr

application/x-pr

.prf

application/pics-rules

.prn

application/x-prn

.prt

application/x-prt

.ps

application/x-ps

.ps

application/postscript

.ptn

application/x-ptn

.pwz

application/vnd.ms-powerpoint

.r3t

text/vnd.rn-realtext3d

.ra

audio/vnd.rn-realaudio

.ram

audio/x-pn-realaudio

.ras

application/x-ras

.rat

application/rat-file

.rdf

text/xml

.rec

application/vnd.rn-recording

.red

application/x-red

.rgb

application/x-rgb

.rjs

application/vnd.rn-realsystem-rjs

.rjt

application/vnd.rn-realsystem-rjt

.rlc

application/x-rlc

.rle

application/x-rle

.rm

application/vnd.rn-realmedia

.rmf

application/vnd.adobe.rmf

.rmi

audio/mid

.rmj

application/vnd.rn-realsystem-rmj

.rmm

audio/x-pn-realaudio

.rmp

application/vnd.rn-rn_music_package

.rms

application/vnd.rn-realmedia-secure

.rmvb

application/vnd.rn-realmedia-vbr

.rmx

application/vnd.rn-realsystem-rmx

.rnx

application/vnd.rn-realplayer

.rp

image/vnd.rn-realpix

.rpm

audio/x-pn-realaudio-plugin

.rsml

application/vnd.rn-rsml

.rt

text/vnd.rn-realtext

.rtf

application/msword

.rtf

application/x-rtf

.rv

video/vnd.rn-realvideo

.sam

application/x-sam

.sat

application/x-sat

.sdp

application/sdp

.sdw

application/x-sdw

.sit

application/x-stuffit

.slb

application/x-slb

.sld

application/x-sld

.slk

drawing/x-slk

.smi

application/smil

.smil

application/smil

.smk

application/x-smk

.snd

audio/basic

.sol

text/plain

.sor

text/plain

.spc

application/x-pkcs7-certificates

.spl

application/futuresplash

.spp

text/xml

.ssm

application/streamingmedia

.sst

application/vnd.ms-pki.certstore

.stl

application/vnd.ms-pki.stl

.stm

text/html

.sty

application/x-sty

.svg

text/xml

.swf

application/x-shockwave-flash

.tdf

application/x-tdf

.tg4

application/x-tg4

.tga

application/x-tga

.tif

image/tiff

.tif

application/x-tif

.tiff

image/tiff

.tld

text/xml

.top

drawing/x-top

.torrent

application/x-bittorrent

.tsd

text/xml

.txt

text/plain

.uin

application/x-icq

.uls

text/iuls

.vcf

text/x-vcard

.vda

application/x-vda

.vdx

application/vnd.visio

.vml

text/xml

.vpg

application/x-vpeg005

.vsd

application/vnd.visio

.vsd

application/x-vsd

.vss

application/vnd.visio

.vst

application/vnd.visio

.vst

application/x-vst

.vsw

application/vnd.visio

.vsx

application/vnd.visio

.vtx

application/vnd.visio

.vxml

text/xml

.wav

audio/wav

.wax

audio/x-ms-wax

.wb1

application/x-wb1

.wb2

application/x-wb2

.wb3

application/x-wb3

.wbmp

image/vnd.wap.wbmp

.wiz

application/msword

.wk3

application/x-wk3

.wk4

application/x-wk4

.wkq

application/x-wkq

.wks

application/x-wks

.wm

video/x-ms-wm

.wma

audio/x-ms-wma

.wmd

application/x-ms-wmd

.wmf

application/x-wmf

.wml

text/vnd.wap.wml

.wmv

video/x-ms-wmv

.wmx

video/x-ms-wmx

.wmz

application/x-ms-wmz

.wp6

application/x-wp6

.wpd

application/x-wpd

.wpg

application/x-wpg

.wpl

application/vnd.ms-wpl

.wq1

application/x-wq1

.wr1

application/x-wr1

.wri

application/x-wri

.wrk

application/x-wrk

.ws

application/x-ws

.ws2

application/x-ws

.wsc

text/scriptlet

.wsdl

text/xml

.wvx

video/x-ms-wvx

.xdp

application/vnd.adobe.xdp

.xdr

text/xml

.xfd

application/vnd.adobe.xfd

.xfdf

application/vnd.adobe.xfdf

.xhtml

text/html

.xls

application/vnd.ms-excel

.xls

application/x-xls

.xlw

application/x-xlw

.xml

text/xml

.xpl

audio/scpls

.xq

text/xml

.xql

text/xml

.xquery

text/xml

.xsd

text/xml

.xsl

text/xml

.xslt

text/xml

.xwd

application/x-xwd

.x_b

application/x-x_b

.sis

application/vnd.symbian.install

.sisx

application/vnd.symbian.install

.x_t

application/x-x_t

.ipa

application/vnd.iphone

.apk

application/vnd.android.package-archive

.xap

application/x-silverlight-app

 

38、网络传输协议本质和做用是什么?

协议本质是双方约定好的一种传输规则,为了让传输数据的双方节点能创建链接,按照约定去传输和解析数据

39、能够实现一个简单的网络协议吗?

相关文章
相关标签/搜索