linux网络编程概述
linux网络编程
进程间的通信方式:
- 管道:用于父子进程的通信
- 消息队列:会在内核生成一系列的链表消息
- 共享内存:通过内核创建一个大家独能看见的空间
- 信号:通过pid号标识符发消息
-信号量:对共享内存这些临界资源的P、V控制
这些所有的通信方式都是基于linux内核的,所以不能进行多机通信
多机通信大概有:linux服务器跟安卓手机,IOS,51单片机这些机子的通信
所以基于对多机的通信,就需要网络编程
网络编程:
两台终端需要相互找到对方,才能相互通信,所以网络编程就必须要有地址
当两台设备相互找到后,需要进行相互的交流,就涉及到通信协议:
- 通信协议就是一种字典,也是一种数据格式,当两个人想要对话时,需要两个人都会一种语言,才能交流,哪怕不会语言,但有了一部字典后,就可以相互对照查询后,读出对应的信息
- 就相当于电影里的摩斯密码,一个人可以靠三短一长来沟通,但想要知道它的意思就需要有一本摩斯密码本,根据摩斯密码本来翻译获得人类能识别的信息,达到沟通的目的
单片机的串口通信业需要有串口协议
socket——套接字网络编程:
TCP:面向连接,当A、B之间通信,相当于打电话
- A拨号给B,B接通后就可以通话
- A对于B的情况是能马上知道的
- 连接可靠
- 发指令的时候,需要对传送的数据有很强的精准留存作用
UDP:面向报文,不关心对象是否收到,相当于发短信
- A发给B信息时不知道B是否有收到,或者收到是否有看到信息
- 连接不可靠
- 适合数据量大的传送,在传送视频的时候,一般在传送过程中丢失了5bit对整体影响较小,视频只是会有一丝卡顿,或一点小雪花
总结:TCP/UDP对比
1、TCP面向连接,(如打电话要先拨号建立连接);UDP是无连接的,即发送数据之前是不需要建立连接的
2、TCP提供可靠的服务,通过TCP连接传送的数据,无差错,不丢失,不重复,且按序到达;UDP尽最大努力交付,即不保证可靠交付
3、TCP面向字节流,实际上是TCP把数据看成一连串无结构的字节流;UDP是面向报文的,UDP没有拥塞控制,因此网络出现拥塞不会使源主机的发送速率降低(对实时应用很有用,如IP电话,实时视频会议等)
4、每一条TCP连接只能是点到点的连接;UDP支持一对一,一对多,多对一和多对多的交互通信
5、TCP首部开销20字节;UDP的首部开销小,只有8字节
6、TCP的逻辑通信信道是全双工的可靠信道;UDP则是不可靠信道
端口号的作用
一台拥有IP地址的主机可以提供许多服务,比如Web服务、FTP服务、SMTP服务等
这些服务完全可以通过1个IP地址来实现。
那么,主机是怎么区分不同的网络服务呢?
显然不能只靠IP地址,因为IP地址与网络服务的关系是一对多的关系。
实际上是通过“IP地址+端口号”来区分不同的服务。
端口提供了一种访问通道,服务器一般都是通过知名端口号来识别的。
例如:对于每个TCP/IP实现来说,FTP服务器的TCP端口号都是21,每个Telnet服务器的TCP端口号都是23,每个TFTP(简单文件传送协议)服务器的UDP端口号都是69
对于linux应用层来说,端口号一般选5000~10000中的
字节序
字节序是指多字节数据在计算机内存中存储或者网络传输时各字节的存储顺序。
1. Little endian(小端):将低序字节存储在起始地址
2. Big endian(大端):将高序字节存储在起始地址
- 例子:在内存中双字0x01020304(DWORD)的存储方式
内存地址
4000&4001&4002&4003
LE 04 03 02 01
BE 01 02 03 04
低字节序 | 内存 | 地址 | 数据 | 位置 |
---|---|---|---|---|
高地址 | 4003 | 000 000 01 | 01 | 高序 |
4002 | 000 000 10 | 02 | ||
4001 | 000 000 11 | 03 | ||
低地址(起始位) | 4000 | 000 001 00 | 04 | 低序 |
例子:如果我们将0x1234abcd写入到以0x0000开始的内存中,则结果为
big-endianlittle-endian
0x0000 0x12 0xcd
0x0001 0x34 0xab
0x0002 0xab 0x34
0x0003 0xcd 0x12
x86系列CPU都是little-endian的字节序.
网络字节序是大端字节序