


文章目录
[1.TCP socket](#1.TCP socket)
[2.UDP DatagramSocket](#2.UDP DatagramSocket)
一、通信流程
1.发送
(1)发送方应用程序往socket写 应用数据与网络标识
(2)操作系统协议栈取对应socket的应用数据与网络标识 封装首部成网络数据包 交给网卡
(3)网卡发送网络数据包
2.转发
(4)路由器、交换机转发网络数据包
3.接收
(5)网卡接收网络数据包
(6)操作系统协议栈拿出网卡里的网络数据包 分用首部 把应用数据与网络标识****放到对应socket中
(7)接收方应用程序从socket读 应用数据与网络标识
二、主机层面四元组
主机动态维护 与收发使用****四元组
1.发送时封装原料
主机动态维护的四元组 ++在发送网络数据包时++ ++在操作系统协议栈++ 作封装原料
2.接收时验收本材
主机动态维护的四元组 ++在接收网络数据包时++ ++在操作系统协议栈++ 作验收本材:
- 接收包的目的IP 与本机维护源IP相验 -> 这个包是不是发给本机的
- 接收包的目的端口 与本机维护源端口相验 -> 这个包分发给++哪个socket/进程++
三、socket
socket是操作系统提供给应用程序 的通信端点
1.TCP socket
一条TCP连接 在两侧各有一向socket端点,分属两台主机的内核 各自维护++连向状态++,分别维护的本地/对端信息 是++相反++的
1.1抽象给应用层字节流操作
TCP供应用层 操作 应用数据与网络标识化成的字节流,协议栈内部 封装->++字节流转化++ 网络数据包 <-分用
1.2对待四元组
1.2.1存储
TCP维护连接状态 ,TCP的每个一向socket****都有fd 对应在内核TCB中++存储四元组++
1.2.2逐填
连接建立前后 会**++逐步确定填完++TCB里存储的四元组**
客户端主动连接时:
(1)new Socket(serverIP, serverPort)手动确填 了 -> ++对端IP++ 、++对端端口++
(2)内核自动确填 -> 路由选择 出的++本地IP++ 、没bind自动分配 临时的++本地端口++
服务器被动连接时:
(3)new ServerSocket(localPort)手动确填 了 -> 监听连接 至的++本地端口++
(4)ServerSocket.accept() 返回的socket里面信息确填 -> ++由本端的四元组++
1.2.3照用
逐填完TCB存储的四元组后,后续全程照着使用 存储的四元组
2.UDP DatagramSocket
2.1抽象给应用层数据包操作
UDP供 应用层 操作应用数据与网络标识承载的DatagramSocket,协议栈内部 封装-> ++DatagramSocket转化++网络数据包 <-分用
2.2对待四元组
2.2.1存储
UDP维护本地状态 ,UDP的socket++绑定本地端口++信息
2.2.2剩寻
每次++临时寻找剩外三元组++ 信息 放入DatagramPacket包
3.ServerSocket
ServerSocket监听端口 被动等待 接收主动连接 ,有连接向来后 生成socket去对接
3.1主动连接
new Socket(serverIP, serverPort)主动发起连接 ++得到一向的socket++
3.2被动连接
ServerSocket.accept()被动接收连接 ++得到另向的socket++
4.比较
4.1TCP与UDP
4.1.1完整网络数据包
TCP和UDP都会**++发出++ 完整通信标识的++网络数据包++**,只是它们++给应用层的抽象不同++
4.1.2粘包
- TCP对应用层提供的是没有消息边界 的字节流,需要应用层协议自己做消息边界设计
- UDP对应用层保留了 一个数据报就是一个消息 的边界
4.2ServerSocket与socket
4.2.1不共TCB
监听socket与已连接socket不共用同一个TCB:
- ServerSocket是监听socket·,记录本地 ++监听端口、监听状态、等待建立连接的队列++
- socket是连接socket,记录一向连接 的 ++本地IP/端口、目的IP/端口、序列确认号、发送接收缓冲区、TCP状态++
5.补充
5.1线程里的socket
单线程可以 一时间在与多个socket交流、与每个socket交流多次
多线程可以 同时单位翻倍地扩大交流
四、IO
文件流、网络socket流、控制台标准流
1.输入
1.1底层
InputStream是**++底层++字节输入流**,读取字节
1.2工具
Scanner是文本解析式输入++工具++,对输入源 ++定量切分解析数据++ 地 读取文本
2.输出
2.1底层
OutputStream是**++底层++字节输出工具**,写入字节
2.2工具
PrintWriter是文本兼容式输出++工具++,往输出源 ++转成字节数据++ 地 写入文本
五、缓冲
缓冲是IO系统的普遍机制,对网络,文件,控制台 以字符,字节流 读,写IO 自上而下都有层层的缓冲
1.延存
上层输出流PrintWriter会先将数据写到进程的缓冲区 、向下层层延存、再交给底层输出流OutputStream正式输出
2.刷新
flush刷新进程缓冲区的数据 立即交给下一层
3.检测
网络socket流的Scanner.hasNext()/InputStream.read() 判断当前缓冲区:
- 有数据->返回true/字节数
- 无数据->阻塞等待
- 对端关闭流结束(socket.close或程序结束关闭socket)->返回false/-1
