java网络编程

175 阅读18分钟

osi模型 物理层,就是网络传输的硬件条件:如光纤 数据链路层,如网卡 网络层,如路由器,负责通信间,访问地址的寻找(ip协议,路由作用) 传输层:解决数据间传输的问题(tcp/udp) 会话层:负责传输层的收发包和寻址的功能 表现层,不同类型操作系统间的通信,对数据的翻译 应用层,关注tcp/ip协议的http协议,该层主要是声明了数据传输时,的数据量,数据格式的一个规范

应用层协议: (2)文件bai传输协议(File Transfer Protocol,FTP):用于实现交互式文件传输功能。 (4)超文本传输协议(HyperText Transfer Protocol,HTTP):用于实现WWW服务。

传输控制协议tcp 1、面向连接的、可靠的、基于字节流的传输层通信协议

2、将应用层的数据流分割成报文段并发送给目标节点的tcp层

3、数据包都有序号,对方接收到则发送ACK确认,未收到则重传

4、tcp有检验函数校验传输过程是否有误

tcp的报文头:

在一个系统中,进程间的区别可以使用pid

但是在系统将的通信,进程间的区别使用tcp报文头的source port 和 destination port来表示进程,通过ip地址标识是那一台主机

sequeuece number 表示报文头+携带数据数

ACK 确认号:是通过sequeuece number来确定的,ACK=sequeuece number+1

offset,由于数据报文的大小不确定,这个是表示偏移量

tcp三次握手流程

1、第一次握手:建立连接时,客户端发送SYN包【syn=j】到服务器,并进入SYN_SEND 状态,等待服务器确认;

第二次握手:服务器收到SYN包,必须确认客户的SYN(ack=j+1),同时自己也发送一个SYN包(syn=k),即SYN+ACK包,此时服务器进入SYN——RECV状态;

第三次握手:客户端收到服务器的SYN+ACK包,必须确认客户的SYN(ack=K+1),此包发送完毕后,客户端和服务器进入ESTABBEL状态,完成三次握手。

为什么需要三次握手

udp 1、面向非连接,

2、不维护连接状态,支持同时向多个客户端传输消息

3、数据包报头只有8个字节,额外开销小

4。吞吐量只受限制于数据生产效率、传输速率以及机器性能

5、尽最大的努力交付,不保证可靠交付,不需要维护复杂的连接状态表

6、面向报文,不对应用程序提交的报文消息进行拆分或者合并

结论: tcp和udp的区别

面向连接VS无连接

可靠性:tcp有三次握手和四次挥手,提供可靠性;而udp是有可能会丢失数据

有序性:tcp是有序列号的,每个包是可以排序,udp是无顺序的

速度:tcp需要握手,消耗时间,udp不用,所以udp适合多人游戏,视频等对速度有要求的领域

量级:tcp是重量级的,报文有20多个字节;udp是轻量级的,只有8个字节报文

tcp的滑动窗口

RTT和RTO

RTT:发送一个数据包到收到对应的ACK,所花费的时间

RTO:数据包重传时间(发送的数据包,没有回应,需要重传),可以通过RTT来计算

TCP使用滑动窗口做流量控制与乱序重排

1、保证tcp的可靠性

2、保证TCP的流控特性

报文头有一个window窗口,用于接受方通知发送方还有多少缓存区用于接收数据(保证接受方不会接受不过来)

窗口数据的计算过程:

滑动窗口,也就是缓存可以存储的包的大小

TCP的稳定性是通过重传机制,就是再没收到接收方的ACK时,时重复发送的,之后收到以后,才会滑动窗口,传输后面的包数据

HTTP协议:超文本传输协议,支持客户端服务段模式

特性:支持客户端/服务器模式,无连接,无状态

http请求响应的步骤

客户端连接到web服务器

发送HTTP请求

服务器接受请求并返回HTTP响应

释放TCP连接

客户端浏览器解析HTML

HTTP状态码: 1xx:指信息已经接受,在处理

2xx:请求成功返回

3xx:重定向

4xx:客户端错误

5xx:服务段错误

503有可能时服务器的连接池已经满了,需要等待一段时间

get和post的区别:

Http报文:get 请求放在url,post请求放在报文体

加入了ssl从而有加密机制

传输层协议 tcp与udp tcp: 1.面向连接的传输控制协议tcp 2.传送数据之前必须建立连接,数据传送结束后要释放连接,不提供广播或多播服务,由于tcp要提供可靠的面向连接的传输服务,因此不可避免增加了许多开销,确认,流量控制,计时器及连接管理等 3.可靠,面向连接,时延大,适用于大文件

udp: 1.无连接的用户数据报协议udp 2.传送数据之前不需要建立连接,收到udp报文后也不需要给出任何确认 3.不可靠,无连接,时延小, 4。吞吐量只受限制于数据生产效率、传输速率以及机器性能

HTTP请求的完全过程: 1.浏览器根据域名解析IP地址 浏览器缓存:首先搜索浏览器自身的DNS缓存(缓存的时间比较短,大概只有1分钟,且只能容纳1000条缓存),看自身的缓存中是否是有域名对应的条目,而且没有过期,如果有且没有过期则解析到此结束。 系统缓存:如果浏览器自身的缓存里面没有找到对应的条目,那么浏览器会搜索操作系统自身的DNS缓存,如果找到且没有过期则停止搜索解析到此结束。 路由器缓存:如果系统缓存也没有找到,则会向路由器发送查询请求。 ISP(互联网服务提供商) DNS缓存:如果在路由缓存也没找到,最后要查的就是ISP缓存DNS的服务器。 2.浏览器与WEB服务器建立一个TCP连接 TCP的3次握手 3.浏览器给WEB服务器发送一个HTTP请求 4.服务器端响应HTTP请求,并返回响应信息 5.浏览器解析HTML代码,并请求HTML代码中的资源 6.关闭TCP连接,浏览器对页面进行渲染呈现给用户

序列化技术性能比较: 文件大小:hessian最小,传输带宽方面占有优势。 写操作: 写操作在大批量的时候,protobuf比hessian和jdk有优势。 读操作:读取方面protobuf仍然占有优势,但是总体上来书,hessian和protobuf差距不大。

需要掌握的知识: 建立连接的三次握手; 断开连接的4次握手; http和https的区别; 阻塞和非阻塞的区别; 同步io和异步io; 这是同步IO和异步IO关键区别所在,同步IO和异步IO的关键区别反映在数据拷贝阶段是由用户线程完成还是内核完成。所以说异步IO必须要有操作系统的底层支持。

基于TCP协议的Socket编程的主要步骤 服务器端(server):

  1. 构建一个ServerSocket实例,指定本地的端口。这个socket就是用来监听指定端口的连接请求的。 2.重复如下几个步骤: a. 调用socket的accept()方法来获得下面客户端的连接请求。通过accept()方法返回的socket实例,建立了一个和客户端的新连接。 b.通过这个返回的socket实例获取InputStream和OutputStream,可以通过这两个stream来分别读和写数据。 c.结束的时候调用socket实例的close()方法关闭socket连接。 客户端(client): 1.构建Socket实例,通过指定的远程服务器地址和端口来建立连接。 2.通过Socket实例包含的InputStream和OutputStream来进行数据的读写。 3.操作结束后调用socket实例的close方法,关闭。

开启监听端口去服务:new ServerSocket(9999); accept方法可以创建socket;

http: 无状态协议对于事务处理没有记忆能力。缺少状态意味着如果后续处理需要前面的信息,也就是说,当客户端一次HTTP请求完成以后,客户端再发送一次HTTP请求,HTTP并不知道当前客户端是一个“老用户”。 可以使用Cookie来解决无状态的问题,Cookie就相当于一个通行证,第一次访问的时候给客户端发送一个Cookie,当客户端再次来的时候,拿着Cookie(通行证),那么服务器就知道这个是“老用户”

29、HTTPClient相关问题 什么是httpClient? 支持 HTTP 协议的客户端编程工具包 什么是HttpClient不能做的? 1、HttpClient 不是浏览器,它是一个客户端 http 协议传输类库。HttpClient 被用来发送和接受; 2、不会处理 http 消息的内容,不会进行 javascript 解析 Content-Type标头告诉客户端实际返回的内容的内容类型

http协议是一个应用层协议,其报文分为请求报文和响应报文 当客户端请求一个网页时,会先通过http协议将请求的内容封装在http请求报文之中,服务器收到该请求报文后根据协议规范进行报文解析,然后向客户端返回响应报文。

http报文结构为:

起始行 对报文进行描述 头部 向报文中添加了一些附加信息,是一个名/只的列表,头部和协议配合工作,共同决定了客户端和服务器能做什么事情 例如:Content-Length(主体长度),Content-Type(主体类型)等。 主体 包含数据的主体部分

io的模型有几种; 这里的socket就是java通信基础socket 阻塞IO(线程block)、非阻塞IO(线程一直执行)(用户线程访问socket状态)、多路复用IO(内核访问socket状态,用户线程访问内核)、信号驱动IO(内核将检查到请求连接成功后,发通知给用户线程,用户线程连接io)以及异步IO(用户线程只需要发请求,请求的成功返回和io连接都是内核处理,用户线程收到通知后,直接执行读写操作即可) 阻塞IO(线程block)、非阻塞IO(线程一直执行) 阻塞IO:当用户线程发出IO请求之后,内核会去查看数据是否就绪,如果没有就绪就会等待数据就绪,而用户线程就会处于阻塞状态,用户线程交出CPU。当数据就绪之后,内核会将数据拷贝到用户线程,并返回结果给用户线程,用户线程才解除block状态。 非阻塞IO:当用户线程发起一个read操作后,并不需要等待,而是马上就得到了一个结果。如果结果是一个error时,它就知道数据还没有准备好,于是它可以再次发送read操作。一旦内核中的数据准备好了,并且又再次收到了用户线程的请求,那么它马上就将数据拷贝到了用户线程,然后返回。 所以事实上,在非阻塞IO模型中,用户线程需要不断地询问内核数据是否就绪,也就说非阻塞IO不会交出CPU,而会一直占用CPU。 总结:阻塞IO线程block,等待返回值,才开启线程;非阻塞IO不断访问内核数据是否就绪。 非阻塞存在的问题:在while循环中需要不断地去询问内核数据是否就绪,这样会导致CPU占用率非常高。 非阻塞IO、多路复用IO的区别 多路复用IO模型:目前使用得比较多的模型。Java NIO实际上就是多路复用IO。 在多路复用IO模型中,会有一个线程不断去轮询多个socket的状态,只有当socket真正有读写事件时,才真正调用实际的IO读写操作。因为在多路复用IO模型中,只需要使用一个线程就可以管理多个socket,系统不需要建立新的进程或者线程,也不必维护这些线程和进程,并且只有在真正有socket读写事件进行时,才会使用IO资源,所以它大大减少了资源占用。 非阻塞IO(用户线程访问)、多路复用IO(内核轮询)的区别: 多路复用IO为何比非阻塞IO模型的效率高; 非阻塞IO中,不断地询问socket状态时通过用户线程去进行的,而在多路复用IO中,轮询每个socket状态是内核在进行的,这个效率要比用户线程要高的多。 4.信号驱动IO模型(内核通知线程执行io) 在信号驱动IO模型中,当用户线程发起一个IO请求操作,会给对应的socket注册一个信号函数,然后用户线程会继续执行,当内核数据就绪时会发送一个信号给用户线程,用户线程接收到信号之后,便在信号函数中调用IO读写操作来进行实际的IO请求操作。 5.异步IO模型 异步IO模型才是最理想的IO模型,在异步IO模型中,当用户线程发起read操作之后,立刻就可以开始去做其它的事。 因此不会对用户线程产生任何block。 异步IO模型,内核会等待数据准备完成,然后将数据拷贝到用户线程,当这一切都完成之后,内核会给用户线程发送一个信号,告诉它read操作完成了。用户线程完全不需要实际的整个IO操作是如何进行的,只需要先发起一个请求,当接收内核返回的成功信号时表示IO操作已经完成,可以直接去使用数据了。 异步IO模型和 信号驱动IO模型区别 异步IO模型,用户线程不需要连接io,直接使用数据即可。接受请求成功和io连接都是由内核处理。信号驱动IO模型还需要对io的连接

nio开发的基础实现 服务端开发: 1、开通 serverSocketChannel 2、开启selector 4. 设置非阻塞方式serverSocketChannel 5、将serverSocketChannel注册到selector 5.轮询selector,监控是否有连接 6、如有连接,遍历所有的连接key 7、如果对应的连接已经成功 8、将连接成功的socketChannel绑定到selector 9、通过key得到channel和buffer 9、如果可读写,进行读写操作。

客户端开发:

  1. 得到一个网络通道
  2. 设置非阻塞方式
  3. 提供服务器端的IP地址和端口号
  4. 连接服务器端
  5. 得到一个缓冲区并存入数据
  6. 发送数据

channel,buffer和selector的理解 buffer的三大属性: capacity: 表示容量 Buffer的一个固定的大小值; Buffer满了需要将其清空才能再写; position: 含义取决于Buffer处在读模式还是写模式(初始值为0,写或者读操作的当前位置) 写数据时,初始的position值为0; 其值最大可为capacity-1 将Buffer从写模式切换到读模式,position会被重置为0 limit: 含义取决于Buffer处在读模式还是写模式(写limit=capacity;读limit等于最多可以读取到的数据) 写模式下,limit等于Buffer的capacity 切换Buffer到读模式时, limit表示你最多能读到多少数据;

www.cnblogs.com/weijie4611/… 为什么需要三次握手连接? 第一次握手,A让B知道A连B 第二次握手,B让A知道B收到了消息,证明A可以发送数据了 第三次握手,A让B知道,收到消息,B知道可以接受数据了 为什么要四次握手 blog.csdn.net/baidu_39486…

什么是内核: 现代操作系统设计中,为减少系统本身的开销,往往将一些与硬件紧密相关的(如中断处理程序、设备驱动程序等)、基本的、公共的、运行频率较高的模块(如时钟管理、进程调度等)以及关键性数据结构独立开来,使之常驻内存,并对他们进行保护。通常把这一部分称之为操作系统的内核。

阻塞io:当用户线程发出IO请求之后,内核会去查看数据是否就绪,如果没有就绪就会等待数据就绪,而用户线程就会处于阻塞状态,用户线程交出CPU。当数据就绪之后,内核会将数据拷贝到用户线程,并返回结果给用户线程,用户线程才解除block状态。 典型的阻塞IO模型的例子为: data = socket.read(); 如果数据没有就绪,就会一直阻塞在read方法 2.非阻塞IO模型 当用户线程发起一个read操作后,并不需要等待,而是马上就得到了一个结果。如果结果是一个error时,它就知道数据还没有准备好,于是它可以再次发送read操作。一旦内核中的数据准备好了,并且又再次收到了用户线程的请求,那么它马上就将数据拷贝到了用户线程,然后返回。 所以事实上,在非阻塞IO模型中,用户线程需要不断地询问内核数据是否就绪,也就说非阻塞IO不会交出CPU,而会一直占用CPU。 信号驱动IO模型? 异步IO模型? Socket(套接字)可以看成是两个网络应用程序进行通信时,各自通信连接中的端点 reactor

简单说一下http协议? http是超文本传输协议,从万为网到浏览器的传输。 基于tcp/ip 协议传输(HTML 文件, 图片文件, 查询结果等) http特点: 无连接的含义是限制每次连接只处理一个请求。服务器处理完客户的请求,并收到客户的应答后,即断开连接 HTTP协议是无状态协议。无状态是指协议对于事务处理没有记忆能力。

http协议下客户端请求报文是什么? 客户端发送一个HTTP请求到服务器的请求消息包括以下格式: 请求行(request line) 请求头部(header) 空行 请求数据

四个部分组成

下面是常见的HTTP状态码: l 200 - 请求成功 l 301 - 资源(网页等)被永久转移到其它URL l 404 - 请求的资源(网页等)不存在 l 500 - 内部服务器错误

网络传输协议本质和作用是什么 协议本质是双方约定好的一种传输规则,为了让传输数据的双方节点能建立连接,按照约定去传输和解析数据

请说出TCP和UDP的区别? TCP应用场景: 效率要求相对低,但对准确性要求相对高的场景。因为传输中需要对数据确认、重发、排序等操作,相比之下效率没有UDP高。举几个例子:文件传输(准确高要求高、但是速度可以相对慢)、接受邮件、远程登录。

UDP应用场景: 效率要求相对高,对准确性要求相对低的场景。举几个例子:QQ聊天、在线视频、网络语音电话(即时通讯,速度要求高,但是出现偶尔断续不是太大问题,并且此处完全不可以使用重发机制)、广播通信(广播、多播)。 TCP: 一种面向连接(连接导向)的、可靠的、基于字节流的传输层(Transport layer)通信协议 。 特点: 面向连接; 点到点的通信; 高可靠性; 占用系统资源多、效率低;

UDP: 一种无连接的、提供面向事务的简单不可靠信息传送服务的传输层通信协议。 特点: 非面向连接 传输不可靠,可能丢失 发送不管对方是否准备好,接收方收到也不确认 可以广播发送 非常简单的协议,开销小