网络通信核心:四元组、socket与IO机制详解

文章目录

一、通信流程

1.发送

2.转发

3.接收

二、主机层面四元组

1.发送时封装原料

2.接收时验收本材

三、socket

[1.TCP socket](#1.TCP socket)

1.1抽象给应用层字节流操作

1.2对待四元组

1.2.1存储

1.2.2逐填

1.2.3照用

[2.UDP DatagramSocket](#2.UDP DatagramSocket)

2.1抽象给应用层数据包操作

2.2对待四元组

2.2.1存储

2.2.2剩寻

3.ServerSocket

3.1主动连接

3.2被动连接

4.比较

4.1TCP与UDP

4.1.1完整网络数据包

4.1.2粘包

4.2ServerSocket与socket

4.2.1不共TCB

5.补充

5.1线程里的socket

四、IO

1.输入

1.1底层

1.2工具

2.输出

2.1底层

2.2工具

五、缓冲

1.延存

2.刷新

3.检测


一、通信流程

1.发送

(1)发送方应用程序往socket写 应用数据与网络标识

(2)操作系统协议栈取对应socket的应用数据与网络标识 封装首部成网络数据包 交给网卡

(3)网卡发送网络数据包


2.转发

(4)路由器、交换机转发网络数据包


3.接收

(5)网卡接收网络数据包

(6)操作系统协议栈拿出网卡里的网络数据包 分用首部应用数据与网络标识****放到对应socket

(7)接收方应用程序从socket读 应用数据与网络标识


二、主机层面四元组

主机动态维护收发使用****四元组

四元组:《网络通信与TCP/IP五层模型》一1.通信标识

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
相关推荐
嘻哈∠※6 小时前
0061基于 SpringBoot 的投稿与稿件处理系统设计与实现
java·spring boot·后端
白狐_7987 小时前
408数据结构第8章:排序②——性质对比秒杀、场景选择与外部排序
java·数据结构·算法
zander2588 小时前
LeetCode 84:柱状图中的最大矩形——单调栈如何确定左右边界
java·数据结构·算法
码匠许师傅8 小时前
【C++ 面试真题】聊聊 C++ 的拷贝构造与拷贝赋值
java·c++·面试
极创信息10 小时前
系统安全隐患全方位排查方案:标准化渗透测试全流程
java·opencv·struts·数据挖掘·eclipse·语音识别·hibernate
汉字萌萌哒10 小时前
2019CCF-CSP入门级C++试题解析
java·开发语言·c++
喜欢的名字被抢了11 小时前
程序出问题怎么查,以及如何让它不掉线
java·运维·数据库
数据知道11 小时前
反序列化漏洞:Java、PHP、Python 三条线各讲透
java·网络·python·安全·网络安全·php
2601_9499506312 小时前
Java 面试准备,用练题簿把“背过八股”变成“真正会答”
java·开发语言·面试·刷题·小程序推荐
Rain的Java大神之路12 小时前
MQ重复消费问题怎么解决
java·经验分享·后端·面试·架构·rabbitmq·rocketmq