


文章目录
[2.Socket API](#2.Socket API)
[2.1DatagramSocket API](#2.1DatagramSocket API)
[2.2DatagramPacket API](#2.2DatagramPacket API)
一、操作位置
写的代码100%都是应用层 ,网络操作并不是 跟随数据包随层部署执行 的,而是始终站全局 能跃层部署执行的
二、通信路径
1.单工
一条单向固定通道,永远只能某向通信
2.半双工
一条双向互通通道,一时间只能 在进行一向通信
3.全双工
两条互逆的单向固定通道,可以同时进行双向通信
三、丢包现象
物理信号干扰篡改 、设备转发上限或接收方处理不过来的数据转接拥塞丢弃 造成数据混乱 就是丢包
四、协议类型
1.UDP
进行一DatagramPacket面多的通信
1.1单位
面向数据包Packet单位
1.2存储
四元组:源+目的IP,源+目的端口号 存储在DatagramPacket对象里面
1.3操作者
DatagramPacket操作它包对象里面存储的通信标识
1.4不可靠
1.4.1信号干扰时
UDP头部的校验和计算发现丢包后 结束丢弃数据包
1.4.2转接拥塞时
UDP无视数据转接时的拥塞状态 始终以恒定速率发包 不管丢弃
2.TCP
进行一Socket向一的通信
2.1单位
面向字节流Stream单位
2.2存储
五元组:源+目的IP,源+目的端口号,协议号 、序列号 、对方接收窗口大小 存储在内核内存中的TCB结构体里面
2.3操作者
Socket存的文件描述符fd 交由内核 操作对应TCB里面存储的通信标识
2.4可靠
2.4.1信号干扰时
TCP头部的校验和计算发现丢包后 接收方****丢弃数据包、不发回复ACK 直到发送方等待超时后重发新包
2.4.2转接拥塞时
TCP会缩小发送窗口来降低发送速率 以减少丢弃
五、服务接口
网络协议栈中,下层都会为上层提供服务接口
1.Socket文件
操作系统把传输层及以下层的硬件 抽象成Socket文件 ,传输层把Socket文件 交应用层,给++针对指向++
1.1DatagramPacket
DatagramPacket是网卡接手 的 压缩五层网络数据的快递包裹,里面填写有:
| 源IP | 本机站点地址 |
| 目的IP | 对机站点地址 |
| 源端口 | 本机存储单类货物间的入门号 |
| 目的端口 | 对机存储单类货物间的入门号 |
|---|
1.2DatagramSocket
DatagramSocket是运输货物系统,在**++构造++时搭起 在源端口号的本机货物房间**
2.Socket API
操作系统把传输层及以下层的内核操作 封装成Socket API ,传输层把Socket API交应用层,给++指挥执行++:
应用层代码调用Socket API 时会触发程序中断 ,执行权限从应用层的用户态 转变成 操作系统的内核态 执行 传输层及以下层的内核操作
2.1DatagramSocket API
2.1.1搭起房间
2.1.1.1服务器
javanew DatagramSocket(int port)能看见自己主机端口分布 的服务器 适合 自定义选择 端口号搭起,在指定源端口搭起本机货物房间 开启运输货物系统
2.1.1.2客户端
javanew DatagramSocket()未探明用户主机端口分布 的客户端 适合 由操作系统随机分配空闲端口号搭起,在随机空闲源端口搭起本机货物房间 开启运输货物系统
2.1.2接收包裹
javaDatagramSocket.receive(DatagramPacket p)运输系统接收二进制数据 覆进网卡数据包,++接收为空 则进入阻塞等待++
2.1.3发送包裹
javaDatagramSocket.send(DatagramPacket p)运输系统发送网卡数据包里的二进制数据
2.2DatagramPacket API
2.2.1制造包裹
javanew DatagramPacket(byte[] buf, int offset, int length, InetAddress address, int port)构造五层压缩的网卡数据包,指定 字节数组++起始+长度++ 部分为应用层数据包 、目的IP 、目的端口号
| 源端口 | 源端口绑定在Socket对象 里,内核会自动抄出来存储 |
| 源IP | 内核拿目的IP查路由表 选合适的网卡IP填为源IP ,会自动选择指定 |
TCP的目的IP、目的端口 TCP连接建立 后 目的IP、目的端口在内核TCB中是++存储确定++ 的,会自动查询指定 [自动指定]
2.2.2提取包裹
2.2.2.1应用层数据包
javaDatagramPacket.getData()网卡数据包获取里面的 字节数组形式 的应用层数据包
2.2.2.2应用层数据包的字节长度
javaDatagramPacket.getLength()网卡数据包获取里面的 字节数组形式的应用层数据包的字节长度
2.2.2.3源IP
javaDatagramPacket.getAddress()网卡数据包获取里面的 源IP
2.2.2.4目的IP
javaDatagramPacket.getLocalAddress()网卡数据包获取里面的 目的IP
2.2.2.5源端口
javaDatagramPacket.getPort()网卡数据包获取里面的 源端口
2.2.2.6目的端口
javaDatagramPacket.getLocalPort()网卡数据包获取里面的 目的端口
2.2.2.7目的IP+目的端口
javaDatagramPacket.getSocketAddress()网卡数据包获取里面的 目的IP+目的端口
转化
1.String->InetAddress
javaInetAddress.getByName(String host)将String字符串转为InetAddress IP地址
2.InetAddress->String
javaInetAddress.toString()将InetAddress IP地址转为String字符串
