网络应用层编程入门

文章目录

一、操作位置

二、通信路径

1.单工

2.半双工

3.全双工

三、丢包现象

四、协议类型

1.UDP

1.1单位

1.2存储

1.3操作者

1.4不可靠

1.4.1信号干扰时

1.4.2转接拥塞时

2.TCP

2.1单位

2.2存储

2.3操作者

2.4可靠

2.4.1信号干扰时

2.4.2转接拥塞时

五、服务接口

1.Socket文件

1.1DatagramPacket

1.2DatagramSocket

[2.Socket API](#2.Socket API)

[2.1DatagramSocket API](#2.1DatagramSocket API)

2.1.1搭起房间

2.1.1.1服务器

2.1.1.2客户端

2.1.2接收包裹

2.1.3发送包裹

[2.2DatagramPacket API](#2.2DatagramPacket API)

2.2.1制造包裹

2.2.2提取包裹

2.2.2.1应用层数据包

2.2.2.2应用层数据包的字节长度

2.2.2.3源IP

2.2.2.4目的IP

2.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.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服务器
java 复制代码
new DatagramSocket(int port)

能看见自己主机端口分布服务器 适合 自定义选择 端口号搭起,在指定源端口搭起本机货物房间 开启运输货物系统


2.1.1.2客户端
java 复制代码
new DatagramSocket()

未探明用户主机端口分布客户端 适合 由操作系统随机分配空闲端口号搭起,在随机空闲源端口搭起本机货物房间 开启运输货物系统


2.1.2接收包裹
java 复制代码
DatagramSocket.receive(DatagramPacket p)

运输系统接收二进制数据 覆进网卡数据包,++接收为 则进入阻塞等待++


2.1.3发送包裹
java 复制代码
DatagramSocket.send(DatagramPacket p)

运输系统发送网卡数据包里的二进制数据


2.2DatagramPacket API

2.2.1制造包裹
java 复制代码
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应用层数据包
java 复制代码
DatagramPacket.getData()

网卡数据包获取里面的 字节数组形式应用层数据包


2.2.2.2应用层数据包的字节长度
java 复制代码
DatagramPacket.getLength()

网卡数据包获取里面的 字节数组形式的应用层数据包的字节长度


2.2.2.3源IP
java 复制代码
DatagramPacket.getAddress()

网卡数据包获取里面的 源IP


2.2.2.4目的IP
java 复制代码
DatagramPacket.getLocalAddress()

网卡数据包获取里面的 目的IP


2.2.2.5源端口
java 复制代码
DatagramPacket.getPort()

网卡数据包获取里面的 源端口


2.2.2.6目的端口
java 复制代码
DatagramPacket.getLocalPort()

网卡数据包获取里面的 目的端口


2.2.2.7目的IP+目的端口
java 复制代码
DatagramPacket.getSocketAddress()

网卡数据包获取里面的 目的IP+目的端口


转化

1.String->InetAddress

java 复制代码
InetAddress.getByName(String host)

将String字符串转为InetAddress IP地址


2.InetAddress->String

java 复制代码
InetAddress.toString()

将InetAddress IP地址转为String字符串

相关推荐
hellojackjiang201118 天前
鸿蒙Next原生IM即时通讯RainbowTalk,纯ArkTS编写,基于开源MobileIMSDK框架
网络编程·信息与通信·harmonyos·即时通讯
w8x9y0z123 天前
大小端转换的隐藏陷阱:为什么你的网络数据传输总是出错?
c语言·网络编程·大小端·数据序列化
Byte不洛1 个月前
TCP 服务器如何支持高并发?单进程、多进程、多线程模型详解
linux·网络编程·高并发·tcp·socket编程
闲人编程1 个月前
使用FastAPI和WebSocket构建高性能实时聊天系统
websocket·网络协议·网络编程·fastapi·持久化·实时聊天·codecapsule
skywalker_111 个月前
网络编程篇
java·网络协议·网络编程
定偶2 个月前
网络编程总结
开发语言·网络·数据结构·网络编程
在路上看风景2 个月前
02. Socket简介
网络编程
定偶2 个月前
网络编程文章
网络·网络编程
无小道2 个月前
基于epoll的单进程Reactor服务器
运维·服务器·c++·网络编程·reactor·epoll