Linux系统编程——网络编程(一)网络编程概述、Socket(套接字),TCP/UDP以及字节序

1、 网络编程概述

进程间通信学习了:管道、消息队列、共享内存、信号、信号量这5种通信方式,但是都是依靠Liunx内核进行的。这也造成了他们的一个缺点就是只能在单机运行

如果要实现多机通信就需要引入网络编程。

那么如何准确地定位网络上一台或多台主机以及定位主机呢?

即通过通信双方的地址。地址由IP地址和端口号组成
IP地址:负责定位主机。
端口号:负责定位主机上的特定应用

端口号的作用:一台拥有IP地址的主机可以提供许多服务,比如Web服务、 FTP服务、SMTP服务等。这些服务完全可以通过1个IP地址来实现。那么,主机是怎样区分不同的网络服务呢?显然不能只靠IP地址,:因为IP地址与网络服务的关系是一对多的关系。实际上是通过"IP地址+端口号"来区分不同的服务的

端口提供了多种访问通道,服务器一般都是通过知名端口号来识别的。例如,对于每个TCP/IP实现来说,FTP服务器的TCP端口号都是21.每个Telnet服务器的TCP端口号都是23,每个TFTP(简单文件 传送协议)服务器的UDP端口号都是69。

找到主机后如何高效地进行数据传偷呢?

按照一定的规则进行传输(即网络通讯协议)

TPC/IP参考模型(TPC/IP协议):事实上的国际标准。—应用层、传输层、网络层、物理+数据链路层

2、Socket(套接字)

Socket在Linux下,用于表示进程间网络通信的特殊文件类型

本质为内核借助缓冲区形成的伪文件。既然是文件,那么理所当然的,我们可以使用文件描述符引用套接字。与管道类似的,Linux系统将其封装成文件的目的是为了统一接口,使得读写套接字和读写文件的操作一致 。区别是管道主要应用于本地进程间通信,而套接字多应用于网络进程间数据的传递

在TCP/IP协议中,“IP地址+TCP或UDP端口号”唯一标识网络通讯中的一个进程。“IP地址+端口号”就对应一个socket。 欲建立连接的两个进程各自有一个socket来标识,那么这两个socket组成的socket pair就唯一标识一个连接。因此可以用Socket来描述网络连接的一对一关系。

Socket(套接字)主要用到的协议

1、TCP(面向连接) 双方必须连接成功才能发数据,类似打电话,主要用于对传输数据精确的情况,如传输指令。
2、UDP(面向报文) 双方无须连接成功就能发数据,类似发短信,主要用于传输大数据量的情况,如视频。

TCP与UDP对比

TCP和UDP是OSI模型中的运输层中的协议

1、TCP面向连接(如打电话要先拨号建立连接) ;UDP是无连接的,即发送数据之前
不需要建立连接。

2、TCP提供可靠的服务。也就是说,通过TCP连接传送的数据,无差错,不丢失,不重复,且按序到达;UDP尽最大努力交付,即不保证可靠交付。

3、TCP面向字节流,实际上是TCP把数据看成一连串无结构的字节流;UDP是面向报文的UDP没有拥塞控制,因此网络出现拥塞不会使源主机的发送速率降低(对实时应用很有用,如IP电话,实时视频会议等)。

4、每一条TCP连接只能是点到点的;UDP支持一对一,” 对多, 多对一和多对多的交互通信。

5、TCP首部开销20字节;UDP的首部开销小,只有8个字节。

6、TCP的逻辑通信信道是全双工的可靠信道,UDP则是不可靠信道

3、字节序

字节序是指多字节数据在计算机内存中存储或者网络传输时各字节的存储顺序

常见序

大端:将高序字节存储在起始地址,即低地址存高字节,高地址存低字节,如:TCP/IP协议字节序

小端:将低序字节存储在起始地址,即低地址存低字节,高地址存高字节,如:X86系列CPU字节序

内存中的多字节数据相对于内存地址有大端和小端之分,磁盘文件中的多字节数据相对于文件中的偏移地址也有大端小端之分。

在这里插入图片描述
网络数据流也有大端小端之分,TCP/IP协议规定,网络数据流应采用大端字节序,即低地址存高字节,高地址存低字节。

为使网络程序具有可移植性,使同样的C代码在大端和小端计算机上编译后都能正常运行,可以调用以下库函数做网络字节序和主机字节序的转换:

#include <arpa/inet.h>

uint32_t htonl(uint32_t hostlong);

uint16_t htons(uint16_t hostshort);

uint32_t ntohl(uint32_t netlong);

uint16_t ntohs(uint16_t netshort);
//h表示host,主机,n表示network,网络,l表示32位长整数(long),s表示16位短整数(short)。

如果主机是小端字节序,这些函数将参数做相应的大小端转换然后返回,如果主机是大端字节序,这些函数不做转换,将参数原封不动地返回。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值