一、网络基础
网络介绍
- 什么叫做网络:通过通信设备,将终端设备连接到一起,互相可以共享信息,这个构建到一起的庞大集合,就是网络!
- 网络编程:基于网络的编程方式,实现网络之间设备的通信!
协议的介绍:
什么叫做网络协议:
数据传输的一种规则、约定、限制的集合!
能够使不同的设备网络通信传递的数据的标准是一致的!
tcp/ip协议族
是一个庞大的协议集合!内部包含最有名的子协议 tcp udp ip http等协议!
注意:所有tcp/ip协议族的子协议,传输数据都需要两个必要的条件ip/mac地址
如果需要找到具体的应用,还需要端口号!
- IP地址(Internet Protocol Address)是指互联网协议地址,又译为网际协议地址
- mac 地址:一般有12位,前六位代表厂商,后六位代表产品编号
tcp协议:
- 一种面向连接,安全可靠的通信协议,每次传输数据前需要三次‘握手’(syn ack+syn ack)
每次传输数据完毕以后。断开需要四次挥手(fin,fin,ack,ack)!
udp协议:
非面向连接的网络协议,每次传输数据包之前不用建立连接,传输大小有限制64kb,非安全,可能丢包!
ip协议
- ip地址寻址协议!根据该协议查找ip地址!
1.1 http协议
HTTP协议超文本传输协议。是现在所有浏览器和服务器软件必用的协议
可以传输任何数据类型。http协议基于tcp协议,也是面向连接的安全可靠!
http协议具体规定了 传输数据格式(请求) 响应数据格式(请求)!
但是注意,http协议属于一次性,一次传递结束以后,不会记录任何状态!
状态码:
- 1xx 中间请求状态
- 2xx 200 202 成功
- 3xx 也是成功!重定向的成功!
- 4xx 404 405 客户端资源路径错误,没有权限!
- 5xx 500 服务器内部错误!
请求方式 :分为两种:即post和get请求
get:为了获取数据设置的请求方式,有参数大小限制,参数会放在路径后面 url?key=value以字符串的形式!
- get不合适上传文件等操作!也不适合隐私性较强的数据传递!
- get的请求方式速度较快!
post:为了提交数据设置的请求方式,没有大小限制,参数不会放在路径后面!
请求体中保留!
- 上传非字符内容!上传大字符内容!隐私性较强的数据传递!
HTTP协议的数据格式:
- 请求:
- 请求行 请求方式【空格】url【空格】协议版本【换行】
- 请求头 key:value【换行】 浏览器的信息
- 空行
- 请求体 post请求数据存放处 本次传输的参数
- 响应
- 状态行 协议版本【空格】状态码【空格】状态【换行】
- 响应头 key:value
- 空行
- 响应正文:返回的数据,json字符串等
1.2网络编程
- 网络编程
- 网络模型分层OSI 7层模式,是ISO网络模型分层标准!
- 因为分层即代表分工!每层一层做不同的事情!
- 发送数据的时候,每层逐步封装!
- 接受数据的时候,每层逐步解析!
- OSI七层网络模型,就是分工明确的网络数据处理的流水线!
- 七层模型
- 应用层:应用层是用户常使用的层面!(HTTP,FTP),不仅可以直接获取用户输入的信息,也可以操作文件系统等!
- 表示层:对应用层传递的数据进行编码,加密,压缩等操作!
- 会话层: 维护会话!网络编程属于一次性!(断点续传)
- 传输层:UDP/TCP 创建更底层的网络通信协议,数据上添加端口!
- 网络层: IP /ICMP / ARP 网络地址寻址
- 数据链路层:MAC设备的物理地址
- 物理层:物理通信设备的管理(传输开启,传输关闭,网线的规则)
- 有的也分为四层
- 应用层 (应用层、表示层、会话层)
- 传输层
- 网络层(网络层、数据链路层)
- 物理层
二、基础概念
- IP地址
- 设备在网络中的标识!
- ip地址格式 32位 二进制 每8位一起 0-255:0-255:0-255:0-255
- ip地址分类
- a 类第一位固定,后三位可变
- b 第二位固定,后二位可变
- c 第三位固定,后一位可变
- d e f 类是测试地址
- 在一个局域网内,ip地址不能重复,一个c类的局域网有254可分配!
- x.x.x.0 网络号 网段号 10.8.154.0
- x.x.x.255 网络广播号
- 端口号:
- 端口号可以理解成应用的门牌号
- 每个应用的门牌号都是固定
- 查找到应用的必须条件
- ip/mac地址是为了找到终端设备 端口号负责找到设备中具体应用!
- 端口号的范围 0-65535
- 系统端口号 0-1023
- 知名端口号 1024-10000
- 子网掩码
- 子网掩码的作用为了判断ip地址的所属网段
- 子网掩码和ip地址做与运算,得出网络号**,可以区分网段!**
- c类ip的子网掩码 255.255.255.0
- mac地址
- mac地址是网卡的唯一标识
- 也是Ip/tcp协议的必备条件
- mac地址12位 16进制组成 前六位:厂商地址 后六位:设备标识
- 已知ip地址,可以通过arp协议查找mac地址
- 已知mac地址可以通过iarp查找ip地址
- Arp协议
- 已知ip地址,可以通过arp协议查找mac地址
- 本地会有缓存 ip地址和 mac地址 cmd - arp -a
- iarp根据mac地址找IP
- 默认网关:
- 所有的网络通信,只能在一个局域网中!
- 如果你连接ip地址在一个网段中,可以直接通信!
- 如果你连接的ip地址不在一个网段中,会走默认网关!
- 网关设备、路由设备
- 路由设备有两个以上网卡
- 可以同时连接多个网段
- 当访问非局域网的时候,通过路由设备向外传递数据
- 默认网关 对应 路由设备在当前局域网的ip地址
- DNS服务器:
- 装域名和ip的服务器地址!
- DNS协议:
- 根据域名 到dns服务器 解析成ip地址的协议!
2.1 客户端如何通过域名访问服务器
- 向dns服务器发起arp,获取dns服务器的mac地址
- 向dns服务器发送dns协议请求,根据域名获取ip
- 向服务器电脑发起arp协议,获取mac地址
- 发起tcp的三次握手(http协议基于的tcp)
- 客户端 —》 SYN —> 服务器
- 服务器 —》 SYN + ACK ----> 客户端
- 客户端 —》 ACK -----》服务器
- 向服务器发起http的 request
- 请求行: 请求方式 空格 路径 空格 协议版本 换行
- 请求头: key:value
- 请求空行: 空行
- 请求体: 携带post方式的请求参数
- 服务器向客户端发起一个响应
- 状态行: 协议版本 空格 状态码 空格 状态
- 响应头: key:value
- 响应空行: 空行
- 响应体: 服务器返回的数据 html 图片 json字符串等等
- TCP的断开连接的4(3)次挥手
- 客户端 —》 FIN+ACK ----》 服务器
- 服务器 —》 FIN ------> 客户端
- 服务器 —》 ACK ------> 客户端
- 客户端 —》 ACK ------》 服务器
- 注意:二和三 在一起发送 ,因此有时候也叫三次挥手
三、TCP协议
如何防止乱码 的发生:
- URLEncoder.encode(str, “utf-8”); 编码
- URLDecoder.decode(encode, “utf-8”); 反转,解码
tcp单向通道
服务端:
创建服务端serversocket(port)
接受客户端的socket socket client = serversocket.accept(); 阻塞
获取client.getinputstream();
读取输入流的数据 input.read()
检测到有效流、或者读取完毕、或者检查到异常会向下执行
关闭资源
客户端:
- 创建一个socket(string ip,int port);
- scanner输入客户端向服务端信息
- socket.getoutputstream();写出内容
- 关闭资源
tcp双向通道:
- 服务端:
- 创建服务端serversocket(port) 1
- 接受客户端的socket socket client = serversocket.accept(); 阻塞 2
- 获取client.getinputstream(); 6
- 读取客户端输入流的数据 7
- 服务器创建scanner 8
- 获取给客户端的内容 9
- 服务创建outputstream socket.getoutputstream() 10
- 内容通过输出流写到客户端 11
- 关闭资源 16
- 客户端:
- 创建一个socket(string ip,int port); 3
- scanner输入客户端向服务端信息 4
- socket.getoutputstream();写出内容 5
- 接受服务端的数据 12
- socket.getinputstream(); 13
- 读取输入流内容,显示即可 14
- 关闭资源 15
四、HTTP
- 创建URL(访问路径)
- 获取连接 HttpURLConnection = url.getconnection();
- 判断连接的状态码 connection.getresponsecode == 200
- 获取服务器的数据 connection.getinputstream();
- 数据解析