网络知识常见面试题:三次握手四次挥手


1 浏览器地址栏输入url后,按下回车会经历的流程

dns解析-->tcp连接-->发送http请求-->服务器处理并返回http报文-->浏览器解析渲染页面-->连接结束

2 http状态码

1xx:指示信息,表示请求已接收,继续处理;
2xx:成功,请求接收并处理;
3xx:重定向,即要完成请求必须进行进一步的操作;
4xx:客户端错误,即请求有语法错误或者请求无法实现;
5xx:服务器错误,即服务器未能正确合理的处理请求;

3 cookie和session的区别

cookie的设置及发送过程
clien发送http request,
server返回http response和Set-Cookie:Jsessionid=xxx;
client携带Set-Cookile发送http request且Cookie:Jsessionid=xxx;
server返回http response;

session的实现方式
主要是借助于cookile,即:
server收到client的http request后,返回http response和Set-Cookie,即Jsessionid,
client发送http request,Cookie:Jsessionid=xxx,

4 http和https的区别

https需要ca认证,http不需要;
https密文传输,http明文传输;
http默认使用80端口,https默认使用443端口;
https相对于http而言,更加的安全可靠;

5 tcp介绍

面向连接的,基于字节流的传输层通信协议;
将应用层数据流分割成报文段并发送给目的节点的tcp层;
数据包都有序号,对方受到则返回ack,未收到则重传;
对数据进行校验,包括传输过程的校验;

tcp报文头:
source port
destination port
sequence number
acknowledge nubmer
tcp flag:最常用的几个ACK/SYN/FIN
ACK:确认序号标识;ACK=1标识确认连接;
SYN:同步序号,用于建立简介过程,SYN=1请求连接;
FIN:finish标识,释放连接标志;


6 tcp三次招手,四次挥手

握手是为了建立连接,挥手是为了断开连接;
可使用wireshark转包工具来进行实际的体会和感受;

三次握手
第一次握手:客户端发送SYN包(seq=x)到服务器,并进入到SYN_SEND状态,等待服务器确认;
第二次握手:服务器收到SYN包后,确认客户端的SYN(ack=seq+1),同时也发送一个SYN包(seq=y)到客户端,状态变为SYN_RECV状态;
第三次握手:客户端收到服务器的SYN+ACK包之后,向服务器发送确认包ACK(ack=y+1),然后客户端服务器均进入ESTABLISHED状态;

为什么需要三次握手去建立连接?
主要是为了初始化Sequence Number的初始值;

具体流程如图所示:


四次挥手
第一次挥手;客户端发送一个FIN,用来关闭client到server的数据传送,client进入FIN_WAIT_1状态;

第二次挥手:server收到FIN后,发送ACK给client,确认序号为收到序号+1,此时server进入CLOSE_WAIT状态;

第三次挥手:server发送一个FIN,用来关闭server到client的数据传送,然后进入LAST_ACK状态;

第四次挥手:client收到FIN后进入TIME_WAIT状态,同时发送ACK给server,确认序号为收到序号+1,然后server进入CLOSED状态;

更直观的流程如下图所示:

为什么需要四次挥手去断开连接?
因为tcp是全双工的,发送方和接送方都需要FIN报文和ACK报文;

tcp滑动窗口
两个基本概念:
RTT:发送数据包到收到对应ACK所花费的时间
RTO:重传时间间隔;

目的:保证tcp的可靠性和流控特性;

7 udp介绍

面向非连接的,
不维护连接状态,支持同时向多个客户端发送相同的消息;
尽最大努力交付,不保证可靠支付;
面向报文的,不对应用程序提交的报文信息进行拆分;


udp报文头非常简单,主要就是source port和destination port,length还有其他一些;

8 tcp和udp的区别

tcp是面向连接的,基于字节流的传输协议;
udp则是非连接的,基于报文的传输协议;

tcp保证可靠支付,udp则是不保证可靠支付;
tcp是有序的,udp是无序的
tcp速度比较慢,udp比较快;


9 tcp/ip四层协议

链路层-->网络层-->运输层-->应用层;


10 socket简介

socket是对tcp/ip协议的抽象,简而言之socket就是操作系统对外开放的接口;


11 关于socket相关的面试编程题

编写一个网络应用程序,有客户端和服务器端,客户端向服务器发送一个字符串,服务器收到该字符串后将其打印到命令行,然后向客户端返回该字符串的长度;
最后客户端输出服务端返回的该字符串的长度,分别用tcp和udp两种方式实现;

考察点:socket通信的基本流程

方式一:tcp方式

public class LengthCalulator extends Thread{

    private Socket socket;

    public LengthCalulator(Socket socket){
        this.socket=socket;
    }


    @Override
    public void run() {
        try {
            //is
            InputStream is=socket.getInputStream();
            //os
            OutputStream os=socket.getOutputStream();
            int ch=0;
            byte[] buff=new byte[1024];
            ch=is.read(buff);
            String content=new String(buff,0,ch);
            System.out.println(content);
            os.write(String.valueOf(content.length()).getBytes());
            //close
            is.close();
            os.close();
            socket.close();
        } catch (IOException e) {
            e.printStackTrace();
        }

    }
}
public class TCPServer {

    public static void main(String[] args) throws IOException {
       ServerSocket serverSocket =new ServerSocket(65000);
       while(true){
           //监听65000端口,直到客户端返回连接信息才返回
           Socket socket=serverSocket.accept();
           //业务逻辑
           new LengthCalulator(socket).start();
       }
    }
}
public class TCPClient {
    public static void main(String[] args) throws IOException {
        Socket socket=new Socket("127.0.0.1",65000);
        //is
        InputStream is=socket.getInputStream();
        //os
        OutputStream os=socket.getOutputStream();
        //要传递的string写入os中
        os.write("hello world".getBytes());
        //长度
        int ch=0;
        //buff用来读取输入的内容
        byte[] buff=new byte[1024];
        is.read(buff);
        String content=new String(buff,0,ch);
        System.out.println(content);
        //close
        is.close();
        os.close();
        socket.close();
    }
}

方式二:udp方式

public class UDPServer {
    public static void main(String[] args) throws IOException {
        DatagramSocket socket=new DatagramSocket(65001);
        byte[] buff=new byte[1024];
        //
        DatagramPacket packet=new DatagramPacket(buff,buff.length);
        socket.receive(packet);
        //
        byte[] data=packet.getData();
        String content=new String(data,0,packet.getLength());
        byte[] sendContent=String.valueOf(content.length()).getBytes();
        //
        DatagramPacket packetToClient=new DatagramPacket(sendContent,sendContent.length,packet.getAddress(),packet.getPort());
        //
        socket.send(packetToClient);
    }
}
public class UDPClient {

    public static void main(String[] args) throws IOException {
        DatagramSocket socket=new DatagramSocket();
        byte[] buff="hello world".getBytes();
        //
        InetAddress address=InetAddress.getByName("127.0.0.1");
        //
        DatagramPacket packet=new DatagramPacket(buff,buff.length,address,65001);
        socket.send(packet);
        //
        byte[] data=new byte[100];
        DatagramPacket receivePacket=new DatagramPacket(data,data.length);
        //
        socket.receive(receivePacket);
        //
        String content=new String(receivePacket.getData(),0,receivePacket.getLength());
        //
        System.out.println(content);
    }
}  }
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值