
文章目录一、通信流程1.发送2.转发3.接收二、主机层面四元组1.发送时封装原料2.接收时验收本材三、socket1.TCP socket1.1抽象给应用层字节流操作1.2对待四元组1.2.1存储1.2.2逐填1.2.3照用2.UDP DatagramSocket2.1抽象给应用层数据包操作2.2对待四元组2.2.1存储2.2.2剩寻3.ServerSocket3.1主动连接3.2被动连接4.比较4.1TCP与UDP4.1.1完整网络数据包4.1.2粘包4.2ServerSocket与socket4.2.1不共TCB5.补充5.1线程里的socket四、IO1.输入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/进程三、socketsocket是操作系统提供给应用程序的通信端点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 DatagramSocket2.1抽象给应用层数据包操作UDP供应用层 操作应用数据与网络标识承载的DatagramSocket协议栈内部封装-DatagramSocket转化网络数据包-分用2.2对待四元组2.2.1存储UDP维护本地状态UDP的socket绑定本地端口信息2.2.2剩寻每次临时寻找剩外三元组信息 放入DatagramPacket包3.ServerSocketServerSocket监听端口被动等待接收主动连接有连接向来后生成socket去对接3.1主动连接new Socket(serverIP, serverPort)主动发起连接得到一向的socket3.2被动连接ServerSocket.accept()被动接收连接得到另向的socket4.比较4.1TCP与UDP4.1.1完整网络数据包TCP和UDP都会发出完整通信标识的网络数据包只是它们给应用层的抽象不同4.1.2粘包TCP对应用层提供的是没有消息边界的字节流需要应用层协议自己做消息边界设计UDP对应用层保留了一个数据报就是一个消息的边界4.2ServerSocket与socket4.2.1不共TCB监听socket与已连接socket不共用同一个TCBServerSocket是监听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