"却还有那些洗礼,那几句问候,那份温柔~"
一、 常用的Linux命令
(1) netstat查看网络状态
netstat是一个用来查看网络状态的重要工具,可以携带很多选项。
n 拒绝显示别名,能显示数字的全部转化成数字.
l 仅列出有在 Listen (监听) 的服務状态.
p 显示建立相关链接的程序名.
t (tcp)仅显示tcp相关选项.
u (udp)仅显示udp相关选项.
a (all)显示所有选项,默认不显示LISTEN相关.
(2) pidof 便于查看服务器进程ID
通过进程名, 查看进程id。
问题:
①一个端口号是否可以bind多个进程?②一个进程是否可bind多个端口号?
端口号 --> 进程这两者是唯一关系。
因此进程可以bind多个端口号,但是端口号只能被一个进程bind。
二、 udp协议
如何学习一个网络协议栈?除开学习它的报头和有效载荷,还应当了解该协议的报头和有效载荷如何进行分用!
(1) udp协议格式端
16位源端口号和目的端口号: 标识正在通信双方主机上的唯一进程。
16位udp长度: udp首部长度+udp数据,因此一个udp报文的最大长度为 也就是 64KB。
16校验和: 如果校验和出错, 就会直接丢弃。
(2) udp特点
udp的传输同tcp不同,基于tcp协议实现的通信,首先要进行三次握手建立连接。我们可以将udp的传输过程,类似于寄信。
① 无连接: 知道对端的IP和端口号就直接进行传输, 不需要建立连接。
② 不可靠: 没有确认机制, 没有重传机制; 如果因为网络故障该段无法发到对方, UDP协议层也不会给应用层返回任何错误信息。
③ 面向数据报: 不能够灵活的控制读写数据的次数和数量。
如何理解udp报头协议?
udp报头是一种协议,而Linux使用C语言写的!但是站在我们语言的视角来看,udp首部报文无非就是一个结构化数据的集合,换句话来说,就是一个对象。
如何理解面向数据报?
udp是面向数据报的,但是这个数据报应该作何理解呢?譬如说,如果我们的上层应用调用sendto(),想通过网络发送100字节的数据到对端。对于对端来说,它要么只会接收到一个含有100字节的udp完整报文,要么就收不到任何udp报文。不会通过循环调用10次recv每次获取10个字节的。
如何理解udp缓冲区以及全双工?
①UDP没有真正意义上的 ”发送缓冲区”,调用sendto会直接交给内核, 由内核将数据传给网络层协议进行后续的传输动作。本质上是因为它是面向数据报的,发多少怎样发跟它关系不大。
②UDP具有 " 接收缓冲区" 。 但是这个接收缓冲区不能保证 收到的 "UDP报的顺序" 和发送UDP报的顺序一致 ; 如果缓冲区满了, 再到达的UDP数据就会被丢弃。
所谓全双工,我们能够感受到的实际现象时,该协议的接收、发送是不受对端的影响。udp协议在对端发送数据的情况下,不影响本主机向对端发送数据。
注意: 如果一个报文大小超过了一个udp自身能携带的总大小64KB,不管是之后的tcp协议还是udp协议,都需要手动对该过大的数据进行手动分包,多次发送。
三、 基于udp的应用层协议
NFS: 网络文件系统
TFTP: 简单文件传输协议
DHCP: 动态主机配置协议
BOOTP: 启动协议(用于无盘设备启动)
DNS: 域名解析协议
总结:
udp协议是一种较为简单的协议,内容本身也不是很多。其本身的特点在于,面向数据报、不可靠、无连接,这些特点同tcp比较起来,总显得很鸡肋,因为tcp是面向字节流的,是可靠的,是要通信前先建立连接的……但这也并不意味着udp似乎是可有可无的协议,最主要的原因是udp简单,相较于tcp而言。
因此,选择什么样的协议,更多需要考虑的是协议特点和应用场景的需求,提高代码的稳定性和可维护性。
本篇到此结束,感谢你的阅读。
祝你好运,向阳而生~