java网络编程面试题【其中一小部分】

1tcp和udp的区别 

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

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

2、tcp连接建立的时候3次握手,断开连接的4次握手的具体过程

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

· 第一次握手是客户端connect连接到server

· 第二次server accept client的请求之后,向client端发送一个消息,相当于说我都准备好了,你连接上我了

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

2.断开连接的4次握手,具体如下:

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

· 另外一端接收到断开连接的请求之后需要对close进行确认,发送一个消息,这是第二次握手

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

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

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

同步:

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

异步:

如果有多个任务或者事件发生,这些事件可以并发地执行,一个事件或者任务的执行不会导致整个流程的暂时等待。

这就是同步和异步。

举个简单的例子,假如有一个任务包括两个子任务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关键字联系起来进行类比。当多个线程同时访问一个变量时,每个线程访问该变量就是一个事件,对于同步来说,就是这些线程必须逐个地来访问该变量,一个线程在访问该变量的过程中,其他线程必须等待;而对于异步来说,就是多个线程不必逐个地访问该变量,可以同时进行访问。

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

你可能感兴趣的:(java网络编程面试题【其中一小部分】)