网络编程

一、网络基础

  • 网络介绍

    • 什么叫做网络:通过通信设备,将终端设备连接到一起,互相可以共享信息,这个构建到一起的庞大集合,就是网络!
    • 网络编程:基于网络的编程方式,实现网络之间设备的通信!
  • 协议的介绍:

    • 什么叫做网络协议:

      • 数据传输的一种规则、约定、限制的集合!

        能够使不同的设备网络通信传递的数据的标准是一致的!

      • 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 客户端如何通过域名访问服务器

  1. 向dns服务器发起arp,获取dns服务器的mac地址
  2. 向dns服务器发送dns协议请求,根据域名获取ip
  3. 向服务器电脑发起arp协议,获取mac地址
  4. 发起tcp的三次握手(http协议基于的tcp)
    1. 客户端 —》 SYN —> 服务器
    2. 服务器 —》 SYN + ACK ----> 客户端
    3. 客户端 —》 ACK -----》服务器
  5. 向服务器发起http的 request
    1. 请求行: 请求方式 空格 路径 空格 协议版本 换行
    2. 请求头: key:value
    3. 请求空行: 空行
    4. 请求体: 携带post方式的请求参数
  6. 服务器向客户端发起一个响应
    1. 状态行: 协议版本 空格 状态码 空格 状态
    2. 响应头: key:value
    3. 响应空行: 空行
    4. 响应体: 服务器返回的数据 html 图片 json字符串等等
  7. TCP的断开连接的4(3)次挥手
    1. 客户端 —》 FIN+ACK ----》 服务器
    2. 服务器 —》 FIN ------> 客户端
    3. 服务器 —》 ACK ------> 客户端
    4. 客户端 —》 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();
  • 数据解析
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值