网络编程

作者: 盛夏光年_49e9 | 来源:发表于2017-11-28 20:57 被阅读0次

    tcp/ip简介

    为了把全世界的所有不同类型的计算机都连接起来,就必须规定一套全球通用的协议,为了实现互联网这个目标,互联网协议簇(Internet Protocol Suite)就是通用协议标准。

    因为互联网协议包含了上百种协议标准,但是最重要的两个协议是TCP和IP协议,所以,大家把互联网的协议简称TCP/IP协议

    常用的网络协议如下图所示:

    7层的时候

    说明:

    网际层也称为:网络层

    网络接口层也称为:链路层

    1. 什么是端口

    在linux系统中,端口可以有65536(2的16次方)个之多!

    2. 端口号

    端口是通过端口号来标记的,端口号只有整数,范围是从0到65535

    3. 端口是怎样分配的

    端口号不是随意使用的,而是按照一定的规定进行分配。

    端口的分类标准有好几种,我们这里不做详细讲解,只介绍一下知名端口和动态端口

    3.1 知名端口(Well Known Ports)

    知名端口是众所周知的端口号,范围从0到1023

    80端口分配给HTTP服务

    21端口分配给FTP服务

    可以理解为,一些常用的功能使用的号码是估计的,好比 电话号码110、

    3.2 动态端口(Dynamic Ports)

    动态端口的范围是从1024到65535

    之所以称为动态端口,是因为它一般不固定分配某种服务,而是动态分配。

    动态分配是指当一个系统进程或应用程序进程需要网络通信时,它向主机申请一个端口,主机从可用的端口号中分配一个供它使用。

    当这个进程关闭时,同时也就释放了所占用的端口号。

    3.3 怎样查看端口 ?

    用“netstat -an” “ps -aux”查看端口状态

    4. 小总结

    端口有什么用呢 ? 我们知道,一台拥有IP地址的主机可以提供许多服务,比如HTTP(万维网服务)、FTP(文件传输)、SMTP(电子邮件)等,这些服务完全可以通过1个IP地址来实现。那么,主机是怎样区分不同的网络服务呢?显然不能只靠IP地址,因为IP地址与网络服务的关系是一对多的关系。实际上是通过“IP地址+端口号”来区分不同的服务的。 需要注意的是,端口并不是一一对应的。比如你的电脑作为客户机访问一台WWW服务器时,WWW服务器使用“80”端口与你的电脑通信,但你的电脑则可能使用“3457”这样的端口。

    2.什么是IP地址

    ip地址:用来在网络中标记一台电脑的一串数字,比如192.168.1.1;在本地局域网上是惟一的。

    每一个IP地址包括两部分:网络地址和主机地址

    这里的C类一般是小的局域网部分,网络号都是相同的在同一网络号上,一般能用的只有1-254个,因为255是广播地址,如果写0,那岂不还是表示当前的网络号。

    3.1 A类IP地址

    一个A类IP地址由1字节的网络地址和3字节主机地址组成,网络地址的最高位必须是“0”,

    地址范围1.0.0.1-126.255.255.254

    二进制表示为:00000001 00000000 00000000 00000001 - 01111110 11111111 11111111 11111110

    可用的A类网络有126个,每个网络能容纳1677214个主机

    3.2 B类IP地址

    一个B类IP地址由2个字节的网络地址和2个字节的主机地址组成,网络地址的最高位必须是“10”,

    地址范围128.1.0.1-191.255.255.254

    二进制表示为:10000000 00000001 00000000 00000001 - 10111111 11111111 11111111 11111110

    可用的B类网络有16384个,每个网络能容纳65534主机

    3.3 C类IP地址

    一个C类IP地址由3字节的网络地址和1字节的主机地址组成,网络地址的最高位必须是“110”

    范围192.0.1.1-223.255.255.254

    二进制表示为: 11000000 00000000 00000001 00000001 - 11011111 11111111 11111110 11111110

    C类网络可达2097152个,每个网络能容纳254个主机

    3.4 D类地址用于多点广播

    D类IP地址第一个字节以“1110”开始,它是一个专门保留的地址。

    它并不指向特定的网络,目前这一类地址被用在多点广播(Multicast)中

    多点广播地址用来一次寻址一组计算机

    地址范围224.0.0.1-239.255.255.254

    3.5 E类IP地址

    以“1111”开始,为将来使用保留

    E类地址保留,仅作实验和开发用

    3.6 私有ip

    在这么多网络IP中,国际规定有一部分IP地址是用于我们的局域网使用,也就

    是属于私网IP,不在公网中使用的,它们的范围是:

    10.0.0.0~10.255.255.255

    172.16.0.0~172.31.255.255

    192.168.0.0~192.168.255.255

    3.7 注意

    IP地址127.0.0.1~127.255.255.255用于回路测试,

    如:127.0.0.1可以代表本机IP地址,用http://127.0.0.1就可以测试本机中配置的Web服务器。

    子网掩码

    要想理解什么是子网掩码,就不能不了解IP地址的构成。互联网是由许多小型网络构成的,每个网络上都有许多主机,这样便构成了一个有层次的结构。IP地址在设计时就考虑到地址分配的层次特点,将每个IP地址都分割成网络号和主机号两部分,以便于IP地址的寻址操作。

    IP地址的网络号和主机号各是多少位呢?

    如果不指定,就不知道哪些位是网络号、哪些是主机号,这就需要通过子网掩码来实现。

    子网掩码不能单独存在,它必须结合IP地址一起使用。

    子网掩码只有一个作用,就是将某个IP地址划分成网络地址和主机地址两部分子网掩码的设定必须遵循一定的规则。

    与IP地址相同,子网掩码的长度也是32位,

    左边是网络位,用二进制数字“1”表示;

    右边是主机位,用二进制数字“0”表示。

    假设IP地址为“192.168.1.1”子网掩码为“255.255.255.0”。

    其中,“1”有24个,代表与此相对应的IP地址左边24位是网络号;

    “0”有8个,代表与此相对应的IP地址右边8位是主机号。

    这样,子网掩码就确定了一个IP地址的32位二进制数字中哪些是网络号、哪些是主机号。

    这对于采用TCP/IP协议的网络来说非常重要,只有通过子网掩码,才能表明一台主机所在的子网与其他子网的关系,使网络正常工作。

    最常用的两种子网掩码

    子网掩码是“255.255.255.0”的网络:

    最后面一个数字可以在0~255范围内任意变化,因此可以提供256个IP地址。

    但是实际可用的IP地址数量是256-2,即254个,因为主机号不能全是“0”或全是“1”。

    主机号全为0,表示网络号

    主机号全为1,表示网络广播

    注意

    如果将子网掩码设置过大,也就是说子网范围扩大,那么,根据子网寻径规则,很可能发往和本地主机不在同一子网内的目标主机的数据,会因为错误的判断而认为目标主机是在同一子网内,那么,数据包将在本子网内循环,直到超时并抛弃,使数据不能正确到达目标主机,导致网络传输错误;如果将子网掩码设置得过小,那么就会将本来属于同一子网内的机器之间的通信当做是跨子网传输,数据包都交给缺省网关处理,这样势必增加缺省网关(文章下方有解释)的负担,造成网络效率下降。因此,子网掩码应该根据网络的规模进行设置。如果一个网络的规模不超过254台电脑,采用“255.255.255.0”作为子网掩码就可以了,现在大多数局域网都不会超过这个数字,因此“255.255.255.0”是最常用的IP地址子网掩码;假如在一所大学具有1500多台电脑,这种规模的局域网可以使用“255.255.0.0”。

    点击查看站长工具 > 子网掩码

    socket简介

    1.本地的进程间通信(IPC)有很多种方式,例如

    队列

    同步(互斥锁、条件变量等)

    以上通信方式都是在一台机器上不同进程之间的通信方式,那么问题来了

    网络中进程之间如何通信?

    2. 网络中进程之间如何通信

    首要解决的问题是如何唯一标识一个进程,否则通信无从谈起!

    在本地可以通过进程PID来唯一标识一个进程,但是在网络中这是行不通的。

    其实TCP/IP协议族已经帮我们解决了这个问题,网络层的“ip地址”可以唯一标识网络中的主机,而传输层的“协议+端口”可以唯一标识主机中的应用程序(进程)。

    这样利用ip地址,协议,端口就可以标识网络的进程了,网络中的进程通信就可以利用这个标志与其它进程进行交互

    3. 什么是socket

    socket(简称 套接字) 是进程间通信的一种方式,它与其他进程间通信的一个主要不同是:

    它能实现不同主机间的进程间通信,我们网络上各种各样的服务大多都是基于 Socket 来完成通信的

    例如我们每天浏览网页、QQ 聊天、收发 email 等等

    4. 创建socket

    在 Python 中 使用socket 模块的函数 socket 就可以完成:

    socket.socket(AddressFamily, Type)

    说明:

    函数 socket.socket 创建一个 socket,返回该 socket 的描述符,该函数带有两个参数:

    Address Family:可以选择 AF_INET(用于 Internet 进程间通信) 或者 AF_UNIX(用于同一台机器进程间通信),实际工作中常用AF_INET

    Type:套接字类型,可以是 SOCK_STREAM(流式套接字,主要用于 TCP 协议)或者 SOCK_DGRAM(数据报套接字,主要用于 UDP 协议)

    创建一个tcp socket(tcp套接字)

    UDP介绍

    UDP --- 用户数据报协议,是一个无连接的简单的面向数据报的运输层协议。UDP不提供可靠性,它只是把应用程序传给IP层的数据报发送出去,但是并不能保证它们能到达目的地。由于UDP在传输数据报前不用在客户和服务器之间建立一个连接,且没有超时重发等机制,故而传输速度很快。

    UDP是一种面向无连接的协议,每个数据报都是一个独立的信息,包括完整的源地址或目的地址,它在网络上以任何可能的路径传往目的地,因此能否到达目的地,到达目的地的时间以及内容的正确性都是不能被保证的。

    UDP特点:

    UDP是面向无连接的通讯协议,UDP数据包括目的端口号和源端口号信息,由于通讯不需要连接,所以可以实现广播发送。 UDP传输数据时有大小限制,每个被传输的数据报必须限定在64KB之内。 UDP是一个不可靠的协议,发送方所发送的数据报并不一定以相同的次序到达接收方。

    【适用情况】

    UDP是面向消息的协议,通信时不需要建立连接,数据的传输自然是不可靠的,UDP一般用于多点通信和实时的数据业务,比如

    语音广播

    视频

    QQ

    TFTP(简单文件传送)

    SNMP(简单网络管理协议)

    RIP(路由信息协议,如报告股票市场,航空信息)

    DNS(域名解释)

    注重速度流畅

    UDP操作简单,而且仅需要较少的监护,因此通常用于局域网高可靠性的分散系统中client/server应用程序。例如视频会议系统,并不要求音频视频数据绝对的正确,只要保证连贯性就可以了,这种情况下显然使用UDP会更合理一些。

    udp网络程序-发送数据

    socket函数

    mySocket = socket(family, type)

    函数socket()的参数family用于设置网络通信的域,函数socket()根据这个参数选择通信协议的族。通信协议族在文件sys/socket.h中定义。

    函数socket()的参数type用于设置套接字通信的类型,主要有SOCKET_STREAM(流式套接字)、SOCK——DGRAM(数据包套接字)等。

    并不是所有的协议族都实现了这些协议类型,例如,AF_INET协议族就没有实现SOCK_SEQPACKET协议类型。

    创建一个udp客户端程序的流程是简单,具体步骤如下:

    1:创建客户端套接字

    2:发送/接收数据

    3:关闭套接字

    一:文件发消息

    二:文件收消息

    结果是:

    三:接收发送消息,回复默认值OK

    结果是:

    四:模拟服务器

    结果是:

    不过这样只能一次回复一个人,也就是说,只能一次一次的工作,可以用多线程来实现这项工作

    五:多线程模拟服务器

    udp广播

    TCP/IP协议栈中, 传输层只有UDP可以广播.

    点击链接查看广播的计算方法

    点击链接查看在线网络计算器

    运用broadcast来实现

    udp总结

    1. udp是TCP/IP协议族中的一种协议能够完成不同机器上的程序间的数据通信

    2. udp服务器、客户端

    udp的服务器和客户端的区分:往往是通过请求服务和提供服务来进行区分

    请求服务的一方称为:客户端

    提供服务的一方称为:服务器

    3. udp绑定问题

    一般情况下,服务器端,需要绑定端口,目的是为了让其他的客户端能够正确发送到此进程

    客户端,一般不需要绑定,而是让操作系统随机分配,这样就不会因为需要绑定的端口被占用而导致程序无法运行的情况

    tcp相关介绍

    udp通信模型

    udp通信模型中,在通信开始之前,不需要建立相关的链接,只需要发送数据即可,类似于生活中,"写信”

    tcp通信模型

    tcp通信模型中,在通信开始之前,一定要先建立相关的链接,才能发送数据,类似于生活中,"打电话"

    tcp服务器

    如同上面的电话机过程一样,在程序中,如果想要完成一个tcp服务器的功能,需要的流程如下:

    socket创建一个套接字

    bind绑定ip和port

    listen使套接字变为可以被动链接

    accept等待客户端的链接

    recv/send接收发送数据

    一个很简单的tcp服务器如下:

    一:tcp收消息

    二:tcp发消息

    相关文章

      网友评论

        本文标题:网络编程

        本文链接:https://www.haomeiwen.com/subject/lvtybxtx.html