详解)
文章目录一、操作位置二、通信路径1.单工2.半双工3.全双工三、丢包现象四、协议类型1.UDP1.1单位1.2存储1.3操作者1.4不可靠1.4.1信号干扰时1.4.2转接拥塞时2.TCP2.1单位2.2存储2.3操作者2.4可靠2.4.1信号干扰时2.4.2转接拥塞时五、服务接口1.Socket文件1.1DatagramPacket1.2DatagramSocket2.Socket API2.1DatagramSocket API2.1.1搭起房间2.1.1.1服务器2.1.1.2客户端2.1.2接收包裹2.1.3发送包裹2.2DatagramPacket API2.2.1制造包裹2.2.2提取包裹2.2.2.1应用层数据包2.2.2.2应用层数据包的字节长度2.2.2.3源IP2.2.2.4目的IP2.2.2.5源端口2.2.2.6目的端口2.2.2.7目的IP目的端口一、操作位置写的代码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.1DatagramPacketDatagramPacket是网卡接手的压缩五层网络数据的快递包裹里面填写有源IP本机站点地址目的IP对机站点地址源端口本机存储单类货物间的入门号目的端口对机存储单类货物间的入门号1.2DatagramSocketDatagramSocket是运输货物系统在构造时搭起 在源端口号的本机货物房间2.Socket API操作系统把传输层及以下层的内核操作 封装成Socket API传输层把Socket API交应用层,给指挥执行应用层代码调用Socket API时会触发程序中断执行权限从应用层的用户态 转变成操作系统的内核态执行传输层及以下层的内核操作2.1DatagramSocket API2.1.1搭起房间2.1.1.1服务器new DatagramSocket(int port)能看见自己主机端口分布的服务器适合自定义选择端口号搭起在指定源端口搭起本机货物房间开启运输货物系统2.1.1.2客户端new DatagramSocket()未探明用户主机端口分布的客户端适合由操作系统随机分配空闲端口号搭起在随机空闲源端口搭起本机货物房间开启运输货物系统2.1.2接收包裹DatagramSocket.receive(DatagramPacket p)运输系统接收二进制数据 覆进网卡数据包接收为空则进入阻塞等待2.1.3发送包裹DatagramSocket.send(DatagramPacket p)运输系统发送网卡数据包里的二进制数据2.2DatagramPacket API2.2.1制造包裹new 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应用层数据包DatagramPacket.getData()网卡数据包获取里面的字节数组形式的应用层数据包2.2.2.2应用层数据包的字节长度DatagramPacket.getLength()网卡数据包获取里面的字节数组形式的应用层数据包的字节长度2.2.2.3源IPDatagramPacket.getAddress()网卡数据包获取里面的源IP2.2.2.4目的IPDatagramPacket.getLocalAddress()网卡数据包获取里面的目的IP2.2.2.5源端口DatagramPacket.getPort()网卡数据包获取里面的源端口2.2.2.6目的端口DatagramPacket.getLocalPort()网卡数据包获取里面的目的端口2.2.2.7目的IP目的端口DatagramPacket.getSocketAddress()网卡数据包获取里面的目的IP目的端口转化1.String-InetAddressInetAddress.getByName(String host)将String字符串转为InetAddress IP地址2.InetAddress-StringInetAddress.toString()将InetAddress IP地址转为String字符串