文章目录
网络编程
网络编程 - 基本概念
网络通信概述
1.什么是网络?
- 网络是一种辅助双方或者多方能够连接在一起的工具
- 如果没有网络,可想 单机的世界是多么的孤单
2.使用网络的目的
- 就是为了联通多方然后进行通信用的,即把数据从一方传递给另外一方
- 前面的学习编写的程序都是单机的,即不能和其他电脑上的程序进行通信
- 为了让在不同的电脑上运行的软件之间能够互相传递数据,就需要借助网络的功能
总结
- 使用网络能够把多方链接在一起,然后可以进行数据传递
- 所谓的网络编程就是,让不同的电脑上的软件能够进行数据之间的传递,即进程之间的通信。
IP地址
- 就是互联网协议地址,也叫网际协议地址 【192.168.0.1】
- 目的就是用来标记网络上的一台电脑且不能重复
Linux、Windows 查看网卡信息
- Linux:ifconfig
- Window:ipconfig
IP地址的分类
- ip v4:ip version 4 示例:xxx.xxx.xxx.xxx
- ip v6:ip version 6 示例:“fe80::85a7:2688:6ab9:abbd%11”
端口
- 端口就好比一个房子的门,是出入房子的必经之路
简述聊天信息的发送
dest ip(目的ip):192.168.1.1 -----> dest ip(目的ip):192.168.1.1
src ip(源ip):192.168.1.2
dest port(目标端口):7788 -----> dest port(目标端口):7788
src port(源端口):4567
content:你好啊 -----> content:你好啊
端口号
- 端口是通过端口号来进行标记的,端口号只有整数,范围是 0~65535
- 注意:端口数不一样的*nix系统不一样,还可以手动修改
端口的分类
端口是怎样分配的?
- 端口号不是随意使用的,而是按照一定的规定进行分配的。
- 端口的分类有好几种,下面我们介绍几种常见的端口分类
周知端口(Well Known Ports):
周知端口就是众所周知的端口号,范围从0到1023,其中80端口分配给WWW服务,21端口分配给FTP服务等。我们在IE的地址栏里输入一个网址的时候是不必指定端口号的,因为在默认情况下WWW服务的端口是“80”。网络服务是可以使用其他端口号的,如果不是默认的端口号则应该在地址栏上指定端口号,方法是在地址后面加上冒号“:”,再加上端口号。比如使用 “8080”作为WWW服务的端口,则需要在地址栏里输入“网址:8080”。
但是有些系统协议使用固定的端口号,它是不能被改变的,比如139 端口专 门用于NetBIOS与TCP/IP之间的通信,不能手动改变。从0到1023,它们紧密绑定于一些服务,一般不可随意更改和占用。
注册端口(Registered Ports)
端口1024到49151,分配给用户进程或应用 程序。这些进程主要是用户选择 安装的一些应用程序,而不是已经分配好了公认端口的常用程序。这些端口在 没有被服务器资源占用的时候,可以用于用户端动态选用为源端口。
动态/私有端口(Dynamic and/or Private Ports)
动态端口的范围是从49152到65535。之所以称为动态端口,是因为它 一般 不固定分配某种服务,而是动态分配。
从49152到65535。理论上,不应为服务分配这些端口。实际上,机器通常从 1024起分配动态端口。但也有例外:SUN的RPC端口从32768开始
如何查看端口
- 用“netstat -an”查看端口状态
- lsof -i[tcp:udp]:2425
总结
端口有什么用呢?
我们都知道,一台拥有IP地址的主机可以提供很多服务,比如HTTP(万维网服务)、FTP(文件传输)、SMTP(电子邮件)等,这些服务完全可以通过一个IP地址来实现。那么,主机是怎样区分不同的网络服务呢?显然不能只靠IP地址,因为IP地址与网络服务的关系是一对多的关系。实际上是通过“IP地址+端口号”来区分不同的服务的,需要注意的是,端口并不是一一对应的。比如你的电脑作为客户机访问一台WWW服务器的时候,WWW服务器使用“80”端口与你的电脑通信,但你的电脑则可能使用“3456”这样的端口。
socket简介
不同的电脑上的进程之间如何通信
- 首先解决的问题是如何唯一标示一个进程,否则通信无从谈起!
- 在一台电脑上可以通过进程号(PID)来唯一标识一个进程,但是在网络中这是行不通的。
- 其实TCP/IP协议族已经帮我们解决了这个问题,网络层的“IP地址”可以唯一表示网络中的主机,而传输层的“协议+端口”可以唯一标识主机中的应用进程(进程)
- 这样利用IP地址、协议、端口就可以标识网络的进程了,网络中的进程通信就可以利用这个标志与其他进程进行交互。
注意:
- 所谓**‘进程’**指的是:运行的程序以及运行时用到的资源这个整体称之为进程
- 所谓的**‘进程间通信’**指的是:运行的程序之间的数据共享
什么是socket?
- 是用来完成网络通信的必备的“协议”。
- 其实socket本身并不是协议,它是应用层与TCP/IP协议族通信的中间软件抽象层,是一组调用接口(TCP/IP网络的API函数)。
网络有一段关于socket和TCP/IP协议关系的说法比较容易理解
TCP/IP只是一个协议栈,就像操作系统的运行机制一样,必须要具体实现,同时还要提供对外的操作接口。
这个就像操作系统会提供标准的编程接口,比如win32编程接口一样。
TCP/IP也要提供可供程序员做网络开发所用的接口,这就是Socket编程接口。
实际上,传输层的TCP是基于网络层的IP协议的,而应用层的HTTP协议又是基于传输层的TCP协议的,
而Socket本身不算是协议,就像上面所说,它只是提供了一个针对TCP或者UDP编程的接口。
**socket(简称 ‘套接字’)**是进程之间通信的一种方式,它与其他进程间通信的一个主要不同是:它能实现不同主机间的进程间通信,我们网络上各种各样的服务大多都是基于Socket来完成通信的。
例如我们每天浏览的网页、QQ聊天、收发Email等等。
创建socket
在Python中 使用socket 模块的函数 socket就可以完成
import socket
socket.socket(AddressFamily,Type)
说明:
函数 socket.socket创建一个 cosket,该函数带有两个参数:
- AddressFamily:【协议族】可以选择AF_INET(用于Internet进程间通信)或者AF_UNIX(用于同一台机器进程间通信),实际工作中常用AF_INET
- Type:套接字类型,可以是SOCK_STREAM(流式套接字,主要用于TCP协议)或者SOCK_DGRAM(数据报套接字,主要用于UDP协议)
创建一个tcp socket(tcp套接字)
import socket
# 创建tcp的套接字
s = socket.socket(socket.AE_INET, socket.SOCK_STREAM)
# ...这里是使用套接字的功能(省略)...
# 不用的时候,关闭套接字
s.close()
创建一个udp socket(udp套接字)
import socket
# 创建tcp的套接字
s = socket.socket(socket.AE_INET, socket.SOCK_DGRAM)
# ...这里是使用套接字的功能(省略)...
# 不用的时候,关闭套接字
s.close()
说明
- 套接字使用流程 与 文件的使用流程很类似
- 1.创建套接字
- 2.使用套接字收/发数据
- 3.关闭套接字