字节跳动Java面试还要问网络知识?懂一点就好

Posted 哪 吒

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了字节跳动Java面试还要问网络知识?懂一点就好相关的知识,希望对你有一定的参考价值。

一、TCP与UDP

TCP(Transmission Control Protocol,传输控制协议)协议:负责将要传输的文件分段 进行传输,一般用于建立会话 ,其基本特性是可靠传输 、流量控制,所谓三握手、四挥手也是基于TCP协议的。

UDP(User Data Protocol,用户数据报协议)协议:一个数据包就能够完成数据通信 ,数据包不分段 ,不需要建立会话 ,不需要流量控制 ,属于不可靠传输 , 屏幕广播 、多播 、广播都是基于UDP协议。

二、基于TCP协议的面向连接的套接字(Internet Socket)

1、TCP

The Transmission Control Protocol 传输控制协议。

2、流格式套接字

我们经常讲的套接字也就是Internet Scoket,根据数据传输方式,可以将Internet Scoket分为几种,在使用socket()创建网络连接时,必须告诉它是哪一种数据传输方式,简单来说就是数据传输的控制协议。

计算机领域称之为:流格式套接字(Stream Sockets),在计算机代码中使用SOCK_STREAM表示。

3、SOCK_STREAM有以下特点

  • 可靠的、双向的通信数据流;
  • 数据传输是按照顺序进行的;
  • 数据在传输中是准确无误的,是自带重发机制的;
  • 数据的发送和接收是不同步的,存在缓冲区;
  • 流格式套接字的典型应用就是HTTP协议,因为浏览器在加载进行解析时必须要数据完整正确。

三、基于UDP协议的无连接的套接字(Datagram Sockets)

1、UDP

User Datagram Protocol 用户数据报协议。

2、数据报格式套接字

基于UDP协议的无连接的套接字,计算机领域称之为:数据报格式套接字(Datagram Sockets),计算机代码中使用SOCK_DGRAM表示。

SOCK_DGRAM是一种高效率、高速度、不可靠的通信数据流。其是基于UDP协议的,不用进行数据校验,只进行数据传输。

3、SOCK_DGRAM有以下特点

  • 每次传输数据大小有限制;
  • 追求高效率、高速度;
  • 传输的数据可能丢失或者损坏(小概率事件);
  • 数据的发送和接收是同步的,也就是存在数据边界;
  • 数据报格式的典型应用就是QQ视频和语音,因为这两者的需求是高效率和低延时,同时小概率的丢失数据不会影响整个数据的传输质量。

四、接收数据的阻塞问题

1、TCP

如果没有数据,阻塞Socket就会等,直到有数;

非阻塞Socket返回WSAEWOULDBLOCK;

如果有数据,有多少就收多少。

2、UDP

如果没有数据,阻塞Socket就会等;

非阻塞Socket返回WSAEWOULDBLOCK;

如果有数据,它是会等整个发包到齐,并接收到整个发包,才返回。

五、TCP实现数据上传

1、TCP服务端

package com.tcpip;
 
import java.io.File;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.net.ServerSocket;
import java.net.Socket;
 
public class TcpServerTest 
    public static void main(String[] args) throws Exception 
        //1、创建服务
        ServerSocket serverSocket = new ServerSocket(9000);
        //2、监听客户端连接
        Socket socket = serverSocket.accept();
        //3、获取输入流
        InputStream is = socket.getInputStream();
        //4、文件输出
        FileOutputStream fos = new FileOutputStream(new File("copy.png"));
        byte[] buffer = new byte[1024];
        int len;
        while ((len=is.read(buffer))!=-1)
            fos.write(buffer,0,len);
        
        //5、关闭资源
        fos.close();
        is.close();
        socket.close();
        serverSocket.close();
    

2、TCP客户端

package com.tcpip;
 
import java.io.File;
import java.io.FileInputStream;
import java.io.OutputStream;
import java.net.InetAddress;
import java.net.Socket;
 
public class TcpClientTest 
    public static void main(String[] args) throws Exception 
        //1、创建一个socket连接
        Socket socket = new Socket(InetAddress.getByName("127.0.0.1"),9000);
        //2、创建一个输出流
        OutputStream os = socket.getOutputStream();
        //3、读取文件
        FileInputStream fis = new FileInputStream(new File("01.png"));
        //4、写入文件
        byte[] buffer = new byte[1024];
        int len;
        while ((len=fis.read(buffer))!=-1)
            os.write(buffer,0,len);
        
        //5.关闭资源
        fis.close();
        os.close();
        socket.close();
    

3、测试

六、UDP实现数据上传

1、UDP接收端

package com.tcpip;
 
import java.net.DatagramPacket;
import java.net.DatagramSocket;
 
public class UdpServerTest 
    public static void main(String[] args) throws Exception 
        //1、开放端口
        DatagramSocket socket = new DatagramSocket(9090);
        //2、接收数据包
        byte[] buffer = new byte[1024];
        DatagramPacket packet = new DatagramPacket(buffer,0,buffer.length);
        socket.receive(packet);
        System.out.println(new String(packet.getData(),0,packet.getData().length));
        //3、关闭连接
        socket.close();
    

2、UDP发送端

package com.tcpip;
 
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
 
public class UdpClientTest 
    public static void main(String[] args) throws Exception 
        //1、建立一个socket
        DatagramSocket socket = new DatagramSocket();
        //2、建个包
        String msg = "UDP 测试";
        InetAddress localhost = InetAddress.getByName("localhost");
        int port  = 9090;
        DatagramPacket packet = new DatagramPacket(msg.getBytes(),0,msg.getBytes().length,localhost,port);
        //3、发送包
        socket.send(packet);
        //4、关闭资源
        socket.close();
    

3、测试

七、网络层的安全问题

1、安全问题都有哪些?

  1. IP欺骗攻击
  2. Smurf攻击(DDOS攻击的一种)
  3. ICMP重定向和不可达攻击
  4. IP地址扫描攻击

2、ipidea简介

ipidea是一家海外爬虫代理商,提供海外住宅ip和海外静态ip,主要是做数据采集的业务,与多个数据采集企业保持长期的合作。它提供9000万ip资源,可以根据抓取需求自定义设置ip轮换时间,从而避免被网站阻止访问。支持账密认证和API提取两种方式提取ip资源,最重要的是支持免费测试。

更多详见全球领先的互联网大数据IP资源



3、ipidea生成api链接,复制链接即可应用

普匿或者透明的ip在进行测试提取ip的同时会浪费大量的时间,最后,可能还会是失效的ip。只是就可以使用代理ip,使用的方式更为的简单,不论是实用性,稳定性、安全性都可以的到保障。使用IPIDEA进行ip提取使用。

4、生成代理ip操作使用方式

在进行服务器维护或者是自己整的代理ip时,很多的使用在都不会进行维护,因此很多的代理ip出现,代理ip的使用相对来说比较简单,有问题可以及时的向代理商进行反馈寻找技术人员进行解决。使用爬虫都是为了快速的完成工作需求,使用代理可以节省工作时间,快速的完成工作。

🍅 Java学习路线配套文章:Java学习路线总结,搬砖工逆袭Java架构师(全网最强)
🍅 基础推荐:Java基础教程系列
🍅 实战推荐:Spring Boot基础教程
🍅 简介:Java领域优质创作者🏆、CSDN哪吒公众号作者✌ 、Java架构师奋斗者💪
🍅 扫描主页左侧二维码,加入群聊,一起学习、一起进步
🍅 欢迎点赞 👍 收藏 ⭐留言 📝

添加微信,备注1024,赠送Java学习路线思维导图

以上是关于字节跳动Java面试还要问网络知识?懂一点就好的主要内容,如果未能解决你的问题,请参考以下文章

敖丙:春招字节跳动蘑菇街四轮面试,分别问了啥?

2021年字节跳动+京东+美团面试总结!最全Android知识总结

字节跳动面试真题:java在线编程平台

字节跳动面试官揪着源码一直问,然后......

字节跳动Java岗面试题;java帮助文档手机版

圆你的大厂梦!字节跳动Java高频面试题真题:一/二/三面+常见问题