Linux 系统编程 学习:006-基于socket的网络编程1:有关概念

背景

上一讲 进程间通信:System V IPC(2)中,我们介绍了System IPC中关于信号量的概念,以及如何使用。

这一讲我们来讨论"BSD socket(简称socket)",作为Linux中进程间通信的最后一种方式。实际上,socket可以跨主机通信。

本来文章标题应该以"进程间xxx"为字眼的,但是在开发中,我们更多提及"基于socket的网络编程"

知识

一开始学习网络编程的时候,看到 socket(套接字) 这个概念比较困扰。但后来通过搜索 以及在 结合在似懂非懂的开发中,最终弄懂了套接字的含义:

套接字是一种抽象的接口,我们不需要关心网络通信的具体细节,就可以将数据通过这种"端口"发生到我们希望送达的地方。

有关概念

端口号概念

在网络技术中,端口(Port)包括逻辑端口和物理端口两种类型。

  • 物理端口指的是物理存在的端口,如ADSL Modem、集线器、交换机、路由器上用于连接其他网络设备的接口,如RJ-45端口、SC端口等等。
  • 逻辑端口是指逻辑意义上用于区分服务的端口,如TCP/IP协议中的服务端口,端口号的范围从0到65535,比如用于浏览网页服务的80端口,用于FTP服务的21端口等。

端口号使用:

TCP与UDP段结构中端口地址都是16比特,可以有在0 ~ 65535范围内的端口号。对于这65536个端口号有以下的使用规定:

  • 端口号小于256的定义为常用端口,服务器一般都是通过常用端口号来识别的。任何TCP/IP实现所提供的服务都用1 ~ 1023之间的端口号,是由ICANN来管理的;
  • 客户端只需保证该端口号在本机上是唯一的就可以了。客户端口号因存在时间很短暂又称临时端口号;
  • 大多数TCP/IP实现给临时端口号分配 1024 ~ 5000之间的端口号。大于5000的端口号是为其他服务器预留的。

TCP UDP

TCP(即传输控制协议)是一种面向连接的传输层协议,它能提供高可靠性通信(即数据无误、数据无丢失、数据无失序、数据无重复到达的通信)

适用情况:

  • 适合于对传输质量要求较高,以及传输大量数据的通信。
  • 在需要可靠数据传输的场合,通常使用TCP协议
  • MSN/QQ等即时通讯软件的用户登录账户管理相关的功能通常采用TCP协议

UDP(User Datagram Protocol)用户数据报协议

是不可靠的无连接的协议。在数据发送前,因为不需要进行连接,所以可以进行高效率的数据传输。

适用情况:

  • 发送小尺寸数据(如对DNS服务器进行IP地址查询时)
  • 在接收到数据,给出应答较困难的网络中使用UDP。(如:无线网络)
  • 适合于广播/组播式通信中。
  • MSN/QQ/Skype等即时通讯软件的点对点文本通讯以及音视频通讯通常采用UDP协议
  • 流媒体、VOD、VoIP、IPTV等网络多媒体服务中通常采用UDP方式进行实时数据传输

IP 地址 与 子网掩码

IP地址:Internet中主机的标识,Internet中的主机要与别的机器通信必须具有一个IP地址

IP地址为32位(IPv4)或者128位(IPv6);每个数据包都必须携带目的IP地址和源IP地址,路由器依靠此信息为数据包选择路由。

表示形式:常用点分十进制形式,如202.38.64.10,最后都会转换为一个32位的无符号整数。

IP地址分类:根据网络规模可以分为,A类,B类,C类,D类和E类。其中A、B、C是基本类,D、E类作为多播和保留使用。

子网掩码::(subnet mask)又叫网络掩码、地址掩码、子网络遮罩,它是一种用来指明一个IP地址的哪些位标识的是主机所在的子网,以及哪些位标识的是主机的位掩码。

字节序

不同类型CPU的主机中,内存存储多字节整数序列有两种方法,称为主机字节序(HBO, Host Byte Order):

  • 小端序(little-endian):将低字节存储在起始地址,称为“Little-Endian”字节序,Intel、AMD等采用的是这种方式;
  • 大端序(big-endian):将高字节存储在起始地址,称为“Big-Endian”字节序,由ARM、Motorola等所采用。

为了避免不同类别主机之间在数据交换时由于对于字节序的不同而导致的差错,引入了网络字节序。网络中传输的数据必须按网络字节序,即大端字节序

在大部分PC机上,当应用进程将整数送入socket前,需要转化成网络字节序;当应用进程从socket取出整数后,要转化成主机字节序(系统所采用的字节序)

在后面我们会用到一些转换函数。

// 主机字节序到网络字节序
u_long htonl (u_long hostlong);
u_short htons (u_short short); // 网络字节序到主机字节序
u_long ntohl (u_long hostlong);
u_short ntohs (u_short short);

补充知识 :Socket 处在网络层次中的哪个位置?

虽然我对于套接字有自己的体会,但是我们可以结合OSI网络模型来加深我们的理解。

套接字(socket)编程接口是从顶上三层(网络协议的应用层)进入传输层的接口。除了提到的原始套接字,套接字编程可以彻底绕过IP层直接读写数据链路层的帧。

为什么套接字提供的是从OSI模型的顶上三层进入传输层的接口,有两个原因:

  • 顶上三层处理具体网络应用(如FTP、HTTP)的所有细节,而对通信细节了解很少;低下四层对具体网络应用了解不多,却处理所有的通信细节(发送数据、等待确认、校验等)。
  • 顶上三层通常构成所谓的用户进程,底下四层却通常作为操作系统内核的一个部分提供。现代操作系统都提供分隔用户进程与内核的机制。

所以,在第4层和第5层之间的接口是构建API的自然位置。

补充:Windows下的socket开发与Linux有何区别?

Windows下的socket程序开发和Linux思路相同,细节处区别如下:

1)Windows下的socket程序依赖Winsock.dll或ws2_32.dll,必须提前加载。

2)Linux使用“文件描述符”的概念,而Windows使用“文件句柄”的概念;Linux不区分socket文件和普通文件,而Windows区分;Linux下socket()函数的返回值为int类型,而Windows下为SOCKET类型,也就是句柄。

3)Linux下使用read()/write()函数读写,而Windows下使用recv()/send()函数发送和接收

4)关闭socket时,Linux使用close()函数,而Windows使用closesocket()函数。

Linux 系统编程 学习:06-基于socket的网络编程1:有关概念的更多相关文章

  1. python核心编程学习(第三版)之网络编程

    套接字 套接字是计算机网络数据结构.在任何类型的通信开始之前,网络应用程序必须创建套接字. 有两种类型的套接字,基于文件和面向网络的. unix套接字是第一个家族,AF_UNIX代表地址家族,缩写AF ...

  2. Linux 系统编程 学习:07-基于socket的网络编程2:基于 UDP 的通信

    Linux 系统编程 学习:07-基于socket的网络编程2:基于 UDP 的通信 背景 上一讲我们介绍了网络编程的一些概念.socket的网络编程的有关概念 这一讲我们来看UDP 通信. 知识 U ...

  3. 一点点linux系统的学习心得

    我相信你正在阅读本文的时候,可能是因为你渴望学习Linux技术.我想分享一下过去两年中我自己的一些学习经历,希望你能更顺利地成为Linuxer. 两年前在Linux系统的运行和维护方面找到了一份工作( ...

  4. 安装虚拟机和Linux系统的学习

    安装虚拟机和Linux系统的学习(随笔3) 1.安装虚拟机 首先我按着老师给的链接上的步骤一步一步安装VirtualBox,进行得十分顺利. 接着则是在虚拟机上安装Ubuntu. 然而安装完成以后按要 ...

  5. 《手把手教你构建自己的 Linux 系统》学习笔记(9)

    目录 autoreconf 命令的作用是什么? aclocal automake -a autoconf 一条命令搞完三面三步 既然有其他的「编译控制软件」为何还是使用 make 来进行编译控制? M ...

  6. Java网络编程和NIO详解9:基于NIO的网络编程框架Netty

    Java网络编程和NIO详解9:基于NIO的网络编程框架Netty 转自https://sylvanassun.github.io/2017/11/30/2017-11-30-netty_introd ...

  7. javaSE学习笔记(16)---网络编程

    javaSE学习笔记(16)---网络编程 基本概念 如今,计算机已经成为人们学习.工作.生活必不可少的工具.我们利用计算机可以和亲朋好友网上聊天,也可以玩网游.发邮件等等,这些功能实现都离不开计算机 ...

  8. Python学习day34-面向对象和网络编程总结

    figure:last-child { margin-bottom: 0.5rem; } #write ol, #write ul { position: relative; } img { max- ...

  9. 浅谈JAVA中如何利用socket进行网络编程(二)

    转自:http://developer.51cto.com/art/201106/268386.htm Socket是网络上运行的两个程序间双向通讯的一端,它既可以接受请求,也可以发送请求,利用它可以 ...

随机推荐

  1. 一些JAVA题目

    进程间通信方式有哪些 1)管道 管道分为有名管道和无名管道 无名管道是一种半双工的通信方式,数据只能单向流动,而且只能在具有亲缘关系的进程间使用.进程的亲缘关系一般指的是父子关系.无明管道一般用于两个 ...

  2. “酒香也怕巷子深” Smartflow-Sharp 工作流

    导语 老话说得好,"酒香不怕巷子深"可是我又不是什么大咖,写得再好也没人知道.所以我今天准备再写写我的工作流组件,写得不好还请大家见谅.写文章对于我来说,有点感觉"茶壶里 ...

  3. Python基本数据类型详细介绍

    Python提供的基本数据类型主要有:布尔类型.整型.浮点型.字符串.列表.元组.集合.字典等等 1.空(None)表示该值是一个空对象,空值是Python里一个特殊的值,用None表示.None不能 ...

  4. GetDlgItem(函数详解)

    转载: https://blog.csdn.net/hk121/article/details/80942850 hwndScroll = GetDlgItem(hwnd, IDC_SCROLL); ...

  5. C++字符串的输入输出整理

    最近在跟一门北大C++程序设计的慕课,openjudge上做到一道题,要求定义一种能够输入输出学生姓名,年龄,学号和学年成绩的类.比较特别的是输入的形式是以逗号隔开的一长串字符串. 我用的方法通过是通 ...

  6. java的string方法使用

    1.将list转换为","隔开的字符串 //videoIdList值转换成 1,2,3 String videoIds = StringUtils.join(videoIdList ...

  7. jq显示数据在kindeditor

    1,定义编辑器的变量为全局变量 2,将数据显示到kindeditor   在我自己这里_下划线相当于数据,也就是将数据显示在kindeditor 中的textarea中 3,jquery获取kinde ...

  8. 用ip xfrm搭ipsec隧道

    拓扑如下 基本的IP配置就不说了,直接写重点,在LS上配置 #配置SA ip xfrm state add src 194.168.10.4 dst 194.168.10.5 proto esp sp ...

  9. Hudi on Flink在顺丰的实践应用

    ​ 获取PDF版本 请关注"实时流式计算" 后台回复 "flink1015"

  10. Elasticsearch修改字段类型 (_reindex)

    1.设置索引t2为想要的数据类型 2.将t1 reindex到t2 3.数据reindex完成删除t1 4.设置索引t1为想要的数据类型 5.将t2 reindex到t1 如果 _reindex 超时 ...