网络编程

网络编程

1.网络体系:

1)七层架构

 

七层结构:

物理层主要包含一些物理设备,主要包含,中继器,集线器,双绞线,等。

数据链路层负责在相邻两个节点之间的线路上无差错的传送以帧为单位的数据,并进行流量控制。主要设备有交换机和网桥

网络层为传送实体提供端到端的交换网络数据传送功能,主要设备有路由器

传输层:为会话层提供透明.可靠的数据传输服务,保证端到端的数据完整性。

会话层:建立和维护应用之间通信的机制。

表示层提供数据的加密.压缩.解压缩.解密等操作。

应用层提供用户应用程序之间的接口服务。主要设备有网关

(2)通讯要素:

①IP地址:

a、用来标识网络中的设备,由4个8位二进制进行标识

域名:baidu.com

子域名:www.baidu.com

0,0,0,0;和127,0,0,1表示自己的本机

b、域名解析:

域名解析是把域名指向网站空间IP,让人们通过注册的域名可以方便地访问到网站一种服务。域名解析也叫域名指向、服务器设置、域名配置以及反向IP登记等等。说得简单点就是将好记的域名解析成IP,服务由DNS服务器完成,是把域名解析到一个IP地址,然后在此IP地址的主机上将一个子目录与域名绑定。通常采用自顶向下逐级解析的算法。

c、查看IP  IPconfig

Ping:判断是否连接上一个IP

②端口号:

用来标识进程的地址,进程的标识

a、常见的端口号

80:表示所有IP的地址

443:http的2.0版本

3306:数据库端口

b、不同的进程的端口号一定不一样

c、端口号1024之前的分配给OS使用,程序员不建议使用

(3)IP对象

InetAddress对象用来描述IP地址对象

4)UDP(全称user datagram protocal)(用户数据协议)

(5)TCP(transmission control protocol)(传输控制协议)

DUO和TCP两者区别:

UDP:

①UDP之间不需要建立连接,不可靠的传输协议

②速度快

③只能传输64位数据

TCP:

①TCP传输之间需要建立连接,可靠的传输协议

②需要建立连接,效率低

③可以无限量传输

④http是基于TCP实现的

UDP的实现:

DatagramSocket

发送和接收对应DatagramSocket中的send和receive方法

TCP的实现:

两类:

Socket(客户端),ServerSocket(服务器端)

服务器:提供服务的机器

IP和端口是固定的,一般情况下不会关机,时刻响应请求

常见的服务器软件:Apache Tomcat\IIS(MS)\Nginx(负载均衡)

Ipv4和ipv6的区别

一、扩展了路由和寻址的能力

IPv6 把 IP 地址由 32 位增加到 128 位,从而能够支持更大的地址空间,估计在地球表面每平米有 4*10^18 个 IPv6 地址,使 IP 地址在可预见的将来不会用完。

IPv6 地址的编码采用类似于 CIDR 的分层分级结构,如同电话号码。简化了路由, 加快了路由速度。

  在多点传播地址中增加了一个“范围”域,从而使多点传播不仅仅局限在子网 内,可以横跨不同的子网,不同的局域网。

二、报头格式的简化

IPv 4 报头格式中一些冗余的域或被丢弃或被列为扩展报头,从而降低了包处理和 报头带宽的开销。虽然 IPv6 的地址是 IPv4 地址的 4 倍。但报头只有它的 2 倍大。

三、对可选项更大的支持

IPv6 的可选项不放入报头,而是放在一个个独立的扩展头部。如果不指定路由器不会打开处理扩展头部 . 这大大改变了路由性能。 IPv6 放宽了对可选项长度的严 格要 求 (IPv4 的可选项总长最多为 40 字节 ) ,并可根据需要随时引入新选项。 IPV6 的很多新的特点就是由选项来提供的,如对 IP 层安全 (IPSEC) 的支持,对巨报 (jumbogram) 的支持以及对 IP 层漫游 (Mobile-IP) 的支持等。

四、QoS的功能
  因特网不仅可以提供各种信息,缩短人们的距离 . 还可以进行网上娱乐。网上 VOD 现正被商家炒得热火朝天,而大多还只是准 VOD 的水平,且只能在局域网上实现, 因特网上的 VOD 都很不理想 . 问题在于 IPv4 的报头虽然有服务类型的字段,实际上 现在的路由器实现中都忽略了这一字段。在 IPv6 的头部,有两个相应的优先权和 流标识字段,允许把数据报指定为某一信息流的组成部分,并可对这些数据报 流量控制。如对于实时通信即使所有分组都丢失也要保持恒速,所以优先权最 高,而一个新闻分组延迟几秒钟也没什么感觉,所以其优先权较低。 IPv6 指定这 两字段是每一 IPv6 节点都必须实现的。

五、身份验证和保密

  IPv6 中加入了关于身份验证、数据一致性和保密性的内容。

六、安全机制IPSec是必选的。IPv4的是可选的或者是需要付费支持的

加强了对移动设备的支持。IPv6在设计之初有有着支持移动设备的思想,允许移动终端在切换接入点时保留相同的IP地址。

七、支持无状态自动地址配置,简化了地址配置过程。无需DNS服务器也可完成地址的配置,路由广播地址前缀,各主机根据自己MAC地址和收到的地址前缀生成可聚合全球单播地址。这也方便了某一区域内的主机同时更换IP地址前缀。

HTTPS和HTTP的区别

什么是HTTPS?

HTTPS (基于安全套接字层的超文本传输协议 或者是 HTTP over SSL) 是一个 Netscape 开发的 Web 协议。

你也可以说:HTTPS = HTTP + SSL

HTTPS 在 HTTP 应用层的基础上使用安全套接字层作为子层。

区别:

1. HTTP 的 URL 以 http:// 开头,而 HTTPS 的 URL 以 https:// 开头

2. HTTP 是不安全的,而 HTTPS 是安全的

3. HTTP 标准端口是 80 ,而 HTTPS 的标准端口是 443

4.  OSI 网络模型中,HTTP 工作于应用层,而 HTTPS 工作在传输层

5. HTTP 无需加密,而 HTTPS 对传输的数据进行加密

6. HTTP 无需证书,而 HTTPS 需要认证证书

TCP三次握手

所谓三次握手(Three-Way Handshake)即建立TCP连接,就是指建立一个TCP连接时,需要客户端和服务端总共发送3个包以确认连接的建立。在socket编程中,这一过程由客户端执行connect来触发,整个流程如下图所示:

 

(1)第一次握手:
Client将标志位SYN置为1,随机产生一个值seq=J,并将该数据包发送给Server,Client进入SYN_SENT状态,等待Server确认。

2)第二次握手:
Server收到数据包后由标志位SYN=1知道Client请求建立连接,Server将标志位SYN和ACK都置为1,ack=J+1,随机产生一个值seq=K,并将该数据包发送给Client以确认连接请求,Server进入SYN_RCVD状态。

3)第三次握手:
Client收到确认后,检查ack是否为J+1,ACK是否为1,如果正确则将标志位ACK置为1,ack=K+1,并将该数据包发送给Server,Server检查ack是否为K+1,ACK是否为1,如果正确则连接建立成功,Client和Server进入ESTABLISHED状态,完成三次握手,随后Client与Server之间可以开始传输数据了。

 SYN攻击:
  在三次握手过程中,Server发送SYN-ACK之后,收到Client的ACK之前的TCP连接称为半连接(half-open connect),此时Server处于SYN_RCVD状态,当收到ACK后,Server转入ESTABLISHED状态。SYN攻击就是Client在短时间内伪造大量不存在的IP地址,并向Server不断地发送SYN包,Server回复确认包,并等待Client的确认,由于源地址是不存在的,因此,Server需要不断重发直至超时,这些伪造的SYN包将产时间占用未连接队列,导致正常的SYN请求因为队列满而被丢弃,从而引起网络堵塞甚至系统瘫痪。SYN攻击时一种典型的DDOS攻击,检测SYN攻击的方式非常简单,即当Server上有大量半连接状态且源IP地址是随机的,则可以断定遭到SYN攻击了,使用如下命令可以让之现行:
  #netstat -nap | grep SYN_RECV

 

四次挥手

,所谓四次挥手(Four-Way Wavehand)即终止TCP连接,就是指断开一个TCP连接时,需要客户端和服务端总共发送4个包以确认连接的断开。在socket编程中,这一过程由客户端或服务端任一方执行close来触发,整个流程如下图所示:

 

(1)第一次挥手:Client发送一个FIN,用来关闭Client到Server的数据传送,Client进入FIN_WAIT_1状态。
  (2)第二次挥手:Server收到FIN后,发送一个ACK给Client,确认序号为收到序号+1(与SYN相同,一个FIN占用一个序号),Server进入CLOSE_WAIT状态。
 (3)第三次挥手:Server发送一个FIN,用来关闭Server到Client的数据传送,Server进入LAST_ACK状态。
  (4)第四次挥手:Client收到FIN后,Client进入TIME_WAIT状态,接着发送一个ACK给Server,确认序号为收到序号+1,Server进入CLOSED状态,完成四次挥手。

图示过程如下:

某个应用进程首先调用close主动关闭连接,这时TCP发送一个FIN M

另一端接收到FIN M之后,执行被动关闭,对这个FIN进行确认。它的接收也作为文件结束符传递给应用进程,因为FIN的接收意味着应用进程在相应的连接上再也接收不到额外数据;

一段时间之后,接收到文件结束符的应用进程调用close关闭它的socket。这导致它的TCP也发送一个FIN N

接收到这个FIN的源发送端TCP对它进行确认。

 

异常:

定义:在程序运行中出现了不正常的情况

为什么需要异常处理:

在没有异常处理之前,正常流程的代码和异常处理的代码相接,可读性很差

异常处理:

在有异常的地方直接new一个对象,然后抛出,利用类的封装性将异常的信息和位置封装成对象

异常类:

用来描述不正常情况的类为异常类,有多种异常就有多少种异常类(下标越界,空指针....)

异常体系:

①异常:分为

(1)运行时异常RuntimeException

(2)编译时异常ComplieTimeException

②错误:

(1)一般不处理直接改代码

(2)一般JVM抛出

Throw和throws的区别

①throw用在方法体里面

throws用在函数里面

②throw抛出的是异常对象

  Throws抛出的是异常类,如果有多个用“,”隔开

异常处理:

①声明方法往调用者身上抛

②捕获异常try-catch-finally

异常需要掌握

1. 开发中控制台能看懂

2. 从输入的日志信息能知道(错误的类型,原因,位置)

3. 能自定义异常类

4. 会处理异常

多线程:

线程创建:

①继承Thread

②实现Runnable(常勇)

为什么会有线程安全问题

原因:①多线程同时访问共享数据资源(数据)

②操作共享数据的代码有多余

解决问题:①同步代码块 synchronize(对象){需要同步执行的代码}

 

 

常见面试题:

1. 线程和进程的区别

1进程是指运行中的应用程序,每一个进程都有自己独立的内存空间。一个应用程序可以同时启动多个进程。例如对于IE浏览器程序,每打开一个IE浏览器窗口,就启动了一个新的进程。同样,每次执行JDKjava.exe程序,就启动了一个独立的Java虚拟机进程,该进程的任务是解析并执行Java程序代码。

2线程是指进程中的一个执行流程,有时也称为执行情景。一个进程可以由多个线程组成,即在一个进程中可以同时运行多个不同的线程,它们分别执行不同的任务。当进程内的多个线程同时运行时,这种运行方式称为并发运行。许多服务器程序,如数据库服务器和Web服务器,都支持并发运行,这些服务器能同时响应来自不同客户的请求。

3进程和线程的主要区别在于:每个进程都需要操作系统为其分配独立的内存地址空间,而同一进程中的所有线程在同一块地址空间中工作,这些线程可以共享同一块内存和系统资源,比如共享一个对象或者共享已经打开的一个文件。

 

 

 

2. 导致死锁的原因

在多道程序系统中,由于多个进程的并发执行,改善了系统资源的利用率并提高了系统 的处理能力。然而,多个进程的并发执行也带来了新的问题——死锁。所谓死锁是指多个进程因竞争资源而造成的一种僵局(互相等待),若无外力作用,这些进程都将无法向前推进

1) 因为系统资源不足。

2) 进程运行推进的顺序不合适。

3) 资源分配不当等。

       如果系统资源充足,进程的资源请求都能够得到满足,死锁出现的可能性就很低,否则就会因争夺有限的资源而陷入死锁。其次,进程运行推进顺序与速度不同,也可能产生死锁。

产生死锁的四个必要条件:

1) 互斥条件:一个资源每次只能被一个进程使用。

2) 请求与保持条件:一个进程因请求资源而阻塞时,对已获得的资源保持不放。

3) 不剥夺条件:进程已获得的资源,在末使用完之前,不能强行剥夺。

4) 循环等待条件:若干进程之间形成一种头尾相接的循环等待资源关系。

       这四个条件是死锁的必要条件,只要系统发生死锁,这些条件必然成立,而只要上述条件之一不满足,就不会发生死锁。

 

3. 解决实锁的方法

为使系统不发生死锁,必须设法破坏产生死锁的四个必要条件之一,或者允许死锁产生, 但当死锁发生时能检测出死锁,并有能力实现恢复。

预防死锁

设置某些限制条件,破坏产生死锁的四个必要条件中的一个或几个,以防止发生死锁。

避免死锁

在资源的动态分配过程中,用某种方法防止系统进入不安全状态,从而避免死锁。

死锁的检测及解除

无需釆取任何限制性措施,允许进程在运行过程中发生死锁。通过系统的检测机构及时地检测出死锁的发生,然后釆取某种措施解除死锁。

预防死锁和避免死锁都属于事先预防策略,但预防死锁的限制条件比较严格,实现起来较为简单,但往往导致系统的效率低,资源利用率低;避免死锁的限制条件相对宽松,资源分配后需要通过算法来判断是否进入不安全状态,实现起来较为复杂。

 

 

 

4. 什么是同步什么是异步

简单一点说, 
同步传输就是,数据没有被对方确认收到则调用传输的函数就不返回。 
接收时,如果对方没有发送数据,则你的线程就一直等待,直到有数据了才返回,可以继续执行其他指令 

异步传输就是,你调用一个函数发送数据,马上返回,你可以继续处理其他事, 
接收时,对方的有数据来,你会接收到一个消息,或者你的相关接收函数会被调用。 

易懂一点说,

异步传输: 你传输吧,我去做我的事了,传输完了告诉我一声 
同步传输: 你现在传输,我要亲眼看你传输完成,才去做别的事

同步是一对一的,异步是一对多,就是一夫多妻和一夫一妻 .

 

 

5. 线程的创建方式

  1.继承Thread类,并复写run方法,创建该类对象,调用start方法开启线程。

                   2.实现Runnable接口,复写run方法,创建Thread类对象,将Runnable子类对象传递给Thread类对象。调用start方法开启线程。

                  

                   第二种方式好,将线程对象和线程任务对象分离开。降低了耦合性,利于维护

                  

                   3.创建FutureTask对象,创建Callable子类对象,复写call(相当于run)方法,将其传递给FutureTask对象(相当于一个Runnable)。

                     创建Thread类对象,将FutureTask对象传递给Thread对象。调用start方法开启线程。这种方式可以获得线程执行完之后的返回值。

 

第三种使用Runnable功能更加强大的一个子类.这个子类是具有返回值类型的任务方法.

第一种和第二种两种方式是run()方法运行完是没有返回值的.

  • 10
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

double_lifly

点喜欢就是最好的打赏!!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值