网路编程面试题

网络编程概述

网络编程就就是编写程序使联网的设备之间进行数据传输。

 

网络协议

计算机之间能够进行相互通信是因为它们都共同遵守一定的规则,即网络协议。

网络协议是为计算机网络中进行数据交换而建立的规则

 

网络层次结构:

TCP/IP模型方法分:数据链路层,网络层,传输层,应用层

OSI参考模型方法分:物理层,数据链路层,网络层,传输层,会话层,表示层,应用层。

我们一般用折中的分层方法:物理层, 数据链路层, 网络层, 传输层和应用层

这里应用层就包括了会话层,表示层和应用层

 

 

socket就在应用程序的传输层和应用层之间

 

常用协议所在的层次:

网络层:IP协议

传输层:TCP协议,UDP协议

应用层:FTP(文件传送协议),Telnet(远程登录协议),DNS(域名解析协议),SMTP(邮件传送协议),POP3协议(邮局协议),HTTP协议

 

为什么要分层

分层的原因:

解耦:各层次独立,易于实现和维护

分工:各层次实现特定的功能

层次的划分有利于国际标准协议的制定

 

各层次的作用

物理层:

作用:为上层协议提供了一个传输数据的可靠的物理媒体。

设备如:光纤,网卡,中继器,集线器

 

数据链路层:

作用:实现计算机网络中相邻节点之间的可靠传输

功能:物理地址寻址、数据的成帧、流量控制、数据的检错、重发等。

主要的协议:以太网协议

主要设备:网桥和交换机

 

网络层:

作用是网络中主机节点之间可靠的网络传输

功能主要包括路由选择、网络寻址、流量控制、拥塞控制、网络互连等。

主要协议:

IP协议(Internet Protocol,因特网互联协议);

ICMP协议(Internet Control Message Protocol,因特网控制报文协议);

ARP协议(Address Resolution Protocol,地址解析协议);

RARP协议(Reverse Address Resolution Protocol,逆地址解析协议)。

主要设备:路由器

 

传输层:

作用:解决跨越网络连接的建立和释放

主要协议:

TCP协议(Transmission Control Protocol,传输控制协议)

UDP协议(User Datagram Protocol,用户数据报协议);

主要设备:网关

 

会话层和表示层:

会话层作用:负责应用程序之间建立、维持和中断会话

表示层租用:把应用层提供的信息变换为能够共同理解的形式,提供字符代码、数据格式、控制信息格式、加密等的统一表示。

 

应用层:

作用:为应用进程提供服务,保证多个系统应用进程相互通信

主要协议:

FTP(文件传送协议)

Telnet(远程登录协议)

DNS(域名解析协议)

SMTP(邮件传送协议)

POP3协议(邮局协议)

HTTP协议(Hyper Text Transfer Protocol)

 

 

ip,tcp/udp,http,套接字

ip协议属于网络层保障可靠的网络

tcp/udp协议属于传输层用于网络间设备的数据传输

http协议属于应用层协议用于应用程序间的数据传输

套接字封装了tcp/ip协议,提供了进程通信的端点

底层协议和高层协议

高层次的协议依赖于低层次的协议,低层次的协议建立之后才能建立高层次的协议连接

 

说一下socket编程

套接字(socket):应用程序可以通过它发送或接收数据,是IP地址与端口的组合。

Socket用于在两个基于TCP/IP协议的应用程序之间相互通信。

socket是在应用层和传输层之间的一个抽象层,抽象为几个简单的接口供应用层调用已实现进程在网络中通信。

网络通信其实就是Socket间的通信。

数据在两个Socket间通过IO传输。

 

Socket通信原理

Socket本质是编程接口(API),对TCP/IP的封装,提供了进程通信的端点。

 

 

网络编程的一般步骤

 

对于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.

 

IP协议

Internet Protocol称为互联网协议

规定了计算机在因特网上进行通信时应当遵守的规则

任何厂家生产的计算机系统,只要遵守IP协议就可以与因特网互连互通。

 

Ip地址

互联网协议地址

IP地址是IP协议提供的一种统一的地址格式

它为互联网上的每一个网络和每一台主机分配一个逻辑地址

ip地址在本地局域网上是惟一的

每一个IP地址包括两部分:网络地址和主机地址

每个IP地址包括两个标识码(ID),即网络ID和主机ID。同一个物理网络上的所有主机都使用同一个网络ID,网络上的一个主机(包括网络上工作站,服务器和路由器等)有一个主机ID与其对应。

 

物理地址:

又称为MAC地址

每个网卡在生产的时候,每个生产商都会给自己的网卡分配一个唯一的ID。

有些工具可以篡改掉。当然,如果局域网里面有两台MAC地址一样的机器,是会有问题的。

 

子网掩码

子网掩码是在IPv4地址资源紧缺的背景下为了解决lP地址分配而产生的虚拟lP技术,通过子网掩码将A、B、C三类地址划分为若干子网,从而显著提高了IP地址的分配效率,有效解决了IP地址资源紧张的局面。另一方面,在企业内网中为了更好地管理网络,网管人员也利用子网掩码的作用,人为地将一个较大的企业内部网络划分为更多个小规模的子网

 

子网掩码将某个IP地址划分成网络地址和主机地址两部分。

子网掩码是一个32位的2进制数, 其对应网络地址的所有位都置为1,对应于主机地址的所有位都置为0。子网掩码告知路由器,地址的哪一部分是网络地址,哪一部分是主机地址

 

对于A类地址来说,默认的子网掩码是255.0.0.0;对于B类地址来说默认的子网掩码是255.255.0.0;对于C类地址来说默认的子网掩码是255.255.255.0。

 

通过子网掩码,就可以判断两个IP在不在一个局域网内部。

 

A,B,C,D,E类地址

IPv4地址按照网络号和主机号的长度被分为五大类。

分类的目的:

A类保留给政府机构,B类分配给中等规模的公司,C类分配给任何需要的人,D类用于组播,E类用于实验

  1. A类地址
    • 地址范围:从1.0.0.0到127.255.255.255。
    • 特点:A类地址的前8位是网络地址,后24位是主机地址。由于网络地址部分较长,A类地址通常分配给拥有大量主机的网络,如大型企业和政府机构。
    • 注意事项:127.0.0.0到127.255.255.255的A类地址是保留地址,用于环回测试(localhost)。
  2. B类地址
    • 地址范围:从128.0.0.0到191.255.255.255。
    • 特点:B类地址的前16位是网络地址,后16位是主机地址。这类地址适用于中型到大型的网络。
    • 注意事项:无特别需要注意的保留地址范围,但需注意合理分配和使用。
  3. C类地址
    • 地址范围:从192.0.0.0到223.255.255.255。
    • 特点:C类地址的前24位是网络地址,后8位是主机地址。这类地址通常用于小型网络,如家庭网络或小型企业。
    • 注意事项:C类地址是目前最常用的地址类型之一,尤其是以192.168开头的地址在家用宽带路由器中非常常见。
  4. D类地址
    • 地址范围:从224.0.0.0到239.255.255.255。
    • 用途:D类地址主要用于多点广播(Multicast),即允许一台主机发送消息到一组指定的主机。
  5. E类地址
    • 地址范围:从240.0.0.0到255.255.255.255。
    • 用途:E类地址目前保留用于实验和科研目的,尚未广泛应用。

 

网关

网关的作用是实现网络与网络之间的通信

常指的网关就是路由器的IP

在没有路由器的情况下,两个网络之间是不能进行TCP/IP通信的,要实现这两个网络之间的通信,则必须通过网关

网络A中主机发送数据给A的网关,A的网关发送给网路B的网关,B的网关在发送给B中的主机

 

 

http协议

也就是超文本传送协议,详细规定了浏览器和万维网服务器之间互相通信的规则,HTTP工作在TCP/IP协议体系中的TCP协议上。

超文本:

超文本是用超链接的方法,将各种不同空间的文字信息组织在一起的网状文本。

“超文本”页面内可以包含图片、链接,甚至音乐、程序等非文字元素。

 

 

常用http结果码

  • 请求成功,浏览器会把响应回来的信息显示在浏览器端。
  • 表示客户端出错,比如说在浏览器端请求一个不存在的资源。
  • 表示当前的请求方式不支持。比如说服务器端只对GET请求做了处理,而客户端的请求是post方式的。
  • 服务器端错误,比如说服务器端代码出现空指针等异常。
  • 表示重定向,重定向到了另一个url。

304 第一访问一个资源后,浏览器会将该资源缓存到本地,第二次再访问该资源时,如果该资源没有发生改变,那么服务器响应给浏览器304状态码,告诉浏览器使用本地缓存的资源。

  1. 1xx:信息类状态码
  • 100 Continue:服务器已接收到请求头,客户端可以发送请求体。
  • 101 Switching Protocols:客户端请求切换协议,服务器允许切换。
  1. 2xx:成功状态码
  • 200 OK:请求已成功处理。
  • 204 No Content:请求成功处理,但没有返回内容。
  1. 3xx:重定向状态码
  • 301 Moved Permanently:永久重定向,请求的网页已永久移动到新的位置。
  • 302 Found:临时重定向,请求的资源被暂时移动到新的 URL。
  • 303 See Other:表示必须临时重定向,并且必须使用GET方式请求。
  • 304 Not Modified:客户端缓存的资源是最新的,服务器没有返回新内容。
  1. 4xx:客户端错误状态码
  • 400 Bad Request:请求语法有误,服务器无法理解。
  • 401 Unauthorized:请求需要用户认证。
  • 403 Forbidden:服务器拒绝请求,通常因为权限问题。
  • 404 Not Found:请求的资源不存在。
  1. 5xx:服务器错误状态码
  • 500 Internal Server Error:服务器内部错误,无法完成对请求的处理。
  • 502 Bad Gateway:作为网关或代理工作的服务器尝试执行请求时,从上游服务器接收到无效的响应。
  • 503 Service Unavailable:由于临时的服务器维护或者过载,服务器当前无法处理请求。

 

TCP/IP协议

传输控制协议/因特网互联协议,又叫网络通讯协议。

它定义了电子设备(如计算机)与因特网之间通信的标准;

TCP/IP是一组包括TCP协议、IP协议、UDP协议、ICMP协议和其他一些协议的协议组。需要进行网络通信的计算机需要提供符合这些协议标准的程序以后,才能进行网络通信。

Udp协议:

(User Datagram Protocol)用户数据报协议,

  • 面向无连接(发送数据无需建立连接)
  • 不可靠(不能确保UDP数据报最终达到目的地, 对接收的数据不发送确认, 无法确定是否到达目的地, 数据不会重发)
  • 不安全
  • 字节开销小,速度快。
  • 适合点对点传输(没有谁是服务器谁是客户端),并且安全性要求不高的网络应用程序。(如聊天)

 

利用udp进行通信是接收方new DatagramSocket(10000);用一个Socket监听一个端口,new DatagramPacket(by,by.length);并创建一个空的数据包对象用来接收传过来的数据包对象ds.receive(dp);用socket来接收过来的数据包,最后ds.close();关闭socket。

发送方new DatagramSocket();建立一个不监听端口的socket,

new DatagramPacket(by,0,by.length,InetAddress.getByName("127.0.0.1"),10000);通过一个封装了数据的数据包指定发送的位置,ds.send(dp);利用socket进行发送,最后ds.close();关闭socket

Tcp协议:

(Transmission Control Protocol )传输控制协议

 

 

  • 面向连接
  • 提供可靠无差错的协议((当发送数据后, 要求对方返回一个确认信息, 如果没有接收到对方确认, 重发.))
  • 基于字节流 (对发送的数据排序, 每个发送字节关联一个序列号. 对方根据此序列号进行数据排序, 确保数据的顺序).
  • 安全
  • 三次握手(连接请求,连接成功,发送数据)。

都是传输层的协议,

IIS,Apache,Tomcat等WEB服务器基础原理都是采用Tcp通信模型的。

 

tcp的数据传输是通过io流进行传输的,new Socket(“192.168.1.1”,9999);客户端建立一个指定服务器ip和端口的socket,s.getOutputStream();out.write(“hello”.getBytes());通过io输出流发送给服务器端数据,最后关闭socket,s.close();

服务器端new ServerSocket(9999);建立一个serverSocket监听一个端口,ss.accept ();通过accept方法来确定客户端是否接通,接通之后s.getInputStream();获得输入流,然后读出其中的数据,最后关闭socket。

 

典型的TCP客户端要经过下面三步操作:

 

1、创建一个Socket实例:构造函数向指定的远程主机和端口建立一个TCP连接;

2、通过套接字的I/O流与服务端通信;

3、使用Socket类的close方法关闭连接

 

典型的TCP服务端执行如下两步操作:

 

1、创建一个ServerSocket实例并指定本地端口,用来监听客户端在该端口发送的TCP连接请求;

2、重复执行:

1)调用ServerSocket的accept()方法以获取客户端连接,并通过其返回值创建一个Socket实例;

2)为返回的Socket实例开启新的线程,并使用返回的Socket实例的I/O流与客户端通信;

3)通信完成后,使用Socket类的close()方法关闭该客户端的套接字连接。

 

 

 

Tcp三次握手四次挥手

TCP通过三次握手建立连接,通过四次挥手断开连接

三次握手是指:需要客户端和服务端总共发送3个包以确认连接的建立。

四次挥手是指:需要客户端和服务端总共发送4个包以确认连接的断开

 

三次握手:

首先客户端发送连接请求报文

服务端接收连接后回复确认报文,并为这次连接分配资源。

Client端接收到server端的确认报文后也向Server段发送确认报文,并分配资源,这样TCP连接就建立了。

 

 

为什么客户端要再发送一次确认:

在TCP协议中,建立连接的关键在于确保双方都能正常接收和发送数据。如果仅进行两次握手,虽然可以确认服务端能够收到客户端的连接请求,但无法确保客户端能够收到服务端的应答。

 

四次挥手:

1、先由Client端向server端发送一个关闭请求报文,请求关闭数据传输

2、server端接收到请求后向Client端回复确认报文告诉客户端已经收到关闭请求做好准备,但可能还有未发送完的数据需要处理。服务端进入等待关闭状态,Client端收到以后做出接收连接释放报文准备

3、server端完成所有数据发送后,向Client端发送连接释放报文,服务端进入最后确认状态

4、Client端收到后发出确认报文,告诉服务端已经收到报文,客户端等待一段时间(2倍报文最大生存时间),以确保服务器收到消息。最后,客户端和服务器都进入CLOSED状态,连接完全关闭。

 

第二次挥手之后,服务端还可以发送消息吗:

第二次挥手仅仅是服务端对客户端关闭连接请求的确认,此时连接处于半关闭状态。这意味着客户端不再向服务器发送数据,但如果服务器仍有数据要发送给客户端,它仍然可以发送。

 

报文最大生存时间:

报文最大生存时间(简称MSL)是指任何报文在网络上存在的最长时间,超过这个时间报文将被丢弃。RFC 793中规定MSL为2分钟,但在实际应用中,MSL的值可以根据需要进行调整,常见的值有30秒、1分钟或2分钟等。MSL的设定是为了防止过时的报文在网络中继续传输,从而避免可能的网络拥塞和数据不一致问题。

 

为什么要进行三次握手四次挥手:

TCP作为一种可靠传输控制协议,其核心思想:既要保证数据可靠传输,又要提高传输的效率,三次握手确保双方收发消息正常

和四次挥手就可以满足

 

 

如果已经建立了连接,但是客户端突然出现故障了怎么办?

TCP还设有一个保活计时器,显然,客户端如果出现故障,服务器不能一直等下去,白白浪费资源。服务器每收到一次客户端的请求后都会重新复位这个计时器,时间通常是设置为2小时,若两小时还没有收到客户端的任何数据,服务器就会发送一个探测报文段,以后每隔75分钟发送一次。若一连发送10个探测报文仍然没反应,服务器就认为客户端出了故障,接着就关闭连接。

 

为什么建立连接是三次握手,而关闭连接却是四次挥手

建立连接的第二次握手其实把确认报文请求报文放在一个数据包发送给客户端了;

而关闭连接时,当收到客户端的释放连接报文时,仅仅表示对方不再发送数据了但是还能接收数据,服务方也未必全部数据都发送给对方了,服务方先发送确认包报文给客服端表示自己接收到了释放连接报文,之后还服务方可以发送一些数据给对方后,等没有数据了再发送释放连接报文给对方来表示同意现在关闭连接。

总结:建立连接把确认报文和连接请求报文放在一个包中发送的;释放连接确认报文和释放连接报文分两次发送的确保数据都已经发送完毕

 

ACK:确认有效报文。Acknowledgement 确认标志

SYN:新连接报文。Synchronize 同步标志

FIN:释放连接报文。finish结束标志

 

TCP三次握手四次挥手详细画出来

握手 A ---SYN-----> B

A <--SYN+ACK-- B

A ---ACK-----> B

 

挥手 A ---FIN--> B

A <--ACK--- B

A <--FIN--- B

A ---ACK--> B

TCP和UDP对比

Udp通信不需要建立连接,TCP通信需要通过三次握手建立连接

UDP通信是不可靠的,TCP会进行消息确认比较可靠(可靠:udp无法保证发送完数据后可以接收到)

UDP不保证数据顺序,TCP可以保证数据顺序(数据有序号进行排序)

UDP通过数据报通信,TCP通过字节流通信

UDP占用资源少速度快,TCP由于建立连接保证可靠占用资源多,速度慢

 

应用场景:

UDP:如音频和多媒体的应用

TCP:文件传输,远程登录,电子邮件

 

 

vpc网络

私有网络(Virtual Private Cloud),在根云构建出独立的网络空间,可以自定义网段划分和IP地址、自定义路由策略等。也可以通过公网/专线建立VPN隧道将私有网络与您的其他云资源连通,灵活部署混合云。

 

经典网络和vpc网络区别

经典网络:IP地址由阿里云统一分配,配置简便,使用方便,适合对操作易用性要求比较高、需要快速使用 ECS 的用户。

VPC专有网络:是指逻辑隔离的私有网络,您可以自定义网络拓扑和 IP 地址,支持通过专线连接。适合于熟悉网络管理的用户。

ECS:云服务器

 

posted @ 2023-02-02 10:32  星光闪闪  阅读(103)  评论(0)    收藏  举报