【JavaEE网络】网络编程及其应用概述

本文讨论了面向字节流的粘包问题及其解决方案,涉及应用层协议设计、TCP异常处理(如进程崩溃、主机关机、主机掉电等)以及TCP/UDP的对比。同时,介绍了IP协议的细节,包括IP地址、子网掩码和IP地址的划分,以及NAT机制和IPv4/IPv6的区别。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


面向字节流
粘包问题

在面向字节流的情况下,会产生一些其他的问题:粘包问题,这里“粘”的是“应用层数据报”,通过TCP read/write的数据,都是TCP报文的载荷,也就是应用层数据。
发送方一次性是可以发送多个应用层数据报的,但是接受的时候,如何区分,从哪里到哪里是一个完整的应用层数据报?如果没设计好,接收方就很难区分,甚至产生bug!

那么如何避免粘包问题呢?归根结底就是一句话,明确两个包之间的边界

在这里插入图片描述

此处正确的做法,是合理地设计应用层协议,这件事本身在传输层这边已经无解了,需要站在应用层的角度,来解决这个问题

1.应用层协议中,引入分隔符,区分包之间的边界。

比如\n

2.应用层协议中,引入"包长度”,也能区分包之闻的边界。

比如使用最开头固定的2个字节表示包的长度,0x0003aaa

粘包问题不仅仅是TCP才有的,只要是面向字节流的机制(文件)也有同样的问题,解决方案也都是一样。要么使用分隔符,要么使用长度

TCP异常情况

网络本身就会存在一些变数,导致TCP连接不能继续正常工作了。以下是出现那些情况时TCP如何处理使其正常

  1. 进程崩溃

进程就没了=>PCB没了=>文件描述符表也就被释放了=>相当于调用了socket.close(),socket在系统内核也是一个文件,也会被放到文件描述符表中=>崩溃的一方就会发出FIN,进一步触发四次挥手,此时连接就正常释放了。此时TCP的处理和进程正常退出没啥区别

  1. 主机关机(正常步骤的关机)

正常关机,就会先尝试干掉所有的进程(强制终止进程),就和上述所说的崩溃的处理是一样的。主机关机会有一定的时间,在这个时间内四次挥手可能是挥完的,如果没挥完也没事

  1. 主机掉电(拔电源,没有任何反应的机会)

电脑瞬间黑了,此时自然就没有任何可以操作的空间了。

在这里插入图片描述

此处就涉及到"心跳包”,B这边虽然是接收方,也会周期性的给对方发起一个 不携带任何 业务数据(载荷)TCP数据报

发起这个包的目的,就是为了触发ACK,就是确认一下A是否正常工作/确认网络是否畅通.

  1. 网线断
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值