07.网络编程-1.网络基础
1、知识点
- tcp/ip协议介绍
- ip地址的分类
- 端口、 端口号
- (重点)socket
- (重点)udp通信
- (重点、 难点)udp应用-echo服务器、 聊天室、 多线程模拟QQ聊天
2、网络通信概述
- 网络就是一种辅助双方或者多方能够连接在一起的工具
如果没有网络可想 单机 的世界是多么的孤单
3、tcp/ip简介
一种大家都认可都遵守的协议,这个计算机都遵守的网络通信协议叫做 TCP/IP 协议
imageTCP/IP协议(族)
- 早期的计算机网络,都是由各厂商自己规定一套协议,IBM、Apple和Microsoft都有各自的网络协议,互不兼容
- 为了把全世界的所有不同类型的计算机都连接起来,就必须规定一套全球通用的协议,为了实现互联网这个目标,互联网协议簇(Internet Protocol Suite)就是通用协议标准。
- 因为互联网协议包含了上百种协议标准,但是最重要的两个协议是TCP和IP协议,所以,大家把互联网的协议简称TCP/IP协议
说明:
- 网际层也称为:网络层
- 网络接口层也称为:链路层
4、端口(Port)
4.1什么是端口
设备与外界通讯交流的出口。端口可分为虚拟端口和物理端口,其中虚拟端口指计算机内部或交换机路由器内的端口,不可见。例如计算机中的80端口、21端口、23端口等。
端口就好一个房子的门,是出入这间房子的必经之路。
4.2端口号
端口是通过端口号来标记的, 端口号只有整数, 范围是从0到65535
知名端口( Well Known Ports)
知名端口是众所周知的端口号, 范围从0到1023
80端口分配给HTTP服务
21端口分配给FTP服务
可以理解为,一些常用的功能使用的号码是固定的, 好比 电话号码110、10086、 10010一样
动态端口( Dynamic Ports)
动态端口的范围是从1024到65535
之所以称为动态端口, 是因为它一般不固定分配某种服务, 而是动态分配。
动态分配是指当一个系统进程或应用程序进程需要网络通信时, 它向主机申请一个端口, 主机从可用的端口号中分配一个供它使用。
当这个进程关闭时, 同时也就释放了所占用的端口号。
4.3怎样查看端口?
用“netstat -an”查看端口状态
4.4端口有什么用呢?
端口有什么用呢 ? 我们知道,一台拥有IP地址的主机可以提供许多服务,比如HTTP(万维网服务)、FTP(文件传输)、SMTP(电子邮件)等,这些服务完全可以通过1个IP地址来实现。
那么,主机是怎样区分不同的网络服务呢?显然不能只靠IP地址,因为IP地址与网络服务的关系是一对多的关系。实际上是通过“IP地址+端口号”来区分不同的服务的。
需要注意的是,端口并不是一一对应的。比如你的电脑作为客户机访问一台WWW服务器时,WWW服务器使用“80”端口与你的电脑通信,但你的电脑则可能使用“3457”这样的端口。
4、ip地址
4.1ip地址
用来在网络中标记一台电脑的一串数字, 比如192.168.1.1; 在本地局域网上是惟一的。
4.2ip地址的分类
每一个IP地址包括两部分: 网络地址和主机地址
4.3A类IP地址
4.4B类IP地址
4.5C类IP地址
4.6D类地址用于多点广播
4.7E类IP地址
4.8私有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
4.9注意
IP地址127.0.0.1~127.255.255.255用于回路测试,
如:127.0.0.1可以代表本机IP地址,用http://127.0.0.1就可以测试本机中配置的Web服务器。
5、子网掩码
要想理解什么是子网掩码,就不能不了解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,表示网络广播
[ip地址,子网掩码计算]http://tool.chinaz.com/Tools/subnetmask)
6、socket(套接字)简介
6.1什么是套接字
socket(简称 套接字) 是进程间通信的一种方式,它与其他进程间通信的一个主要不同是:
它能实现不同主机间的进程间通信,我们网络上各种各样的服务大多都是基于 Socket 来完成通信的
例如我们每天浏览网页、QQ 聊天、收发 email 等等
6.2创建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套接字)
import socket
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
print 'Socket Created'
创建一个udp socket(udp套接字)
import socket
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
print 'Socket Created'