1.网络模型
数据从网络中一个终端上的应用程序传送到另外一个终端的应用程序,中间需要经历很多过程,有多方参与对数据进行层层封装、转发。我们把这个流程在逻辑上进行分层,每一层根据本层的规章制度(协议)各司其职。TCP/IP协议族可以分为四层:应用层、传输层、网络层、数据链路层。
1> 应用层协议
与网络相关的程序通过网络与其他程序通信使用的数据格式规范。比如浏览器向服务器发请求获取网页数据,此时发送的请求报文(皇室信件)就需要遵循HTTP协议(按HTTP协议的要求填写字段)。常见的应用层协议有:
HTTP(80端口),主要用于普通浏览。
HTTPS(443端口),HTTP协议的安全版本。
FTP(20和21端口),用于文件传输。
POP3(110端口),收邮件用。
SMTP(25端口),用来发送电子邮件。
SSH(22端口),用于加密安全登陆用。
DHCP(67端口,动态主机配置协议),动态配置IP地址。
DNS,用于完成地址查找,邮件转发等工作(运行在TCP和UDP协议上)。
SNMP,用于网络信息的收集和网络管理。
ARP,用于动态解析以太网硬件的地址。
2> 传输层协议(解决诸如端到端可靠性(数据是否已经到达目的地)和保证数据按照正确的顺序到达这样的问题。TCP、UDP都是传输层协议)
3> 网络层协议(解决在一个单一网络上传输数据包的问题。IP协议是网络层协议)
4> 数据链路层协议 (它是数据包从一个设备的网络层传输到另外一个设备的网络层遵循的规范。比如以太网协议、Wi-Fi协议)
2.IP介绍
在互联网中,一台主机只有一个IP地址。 IP地址用于在TCP/IP通信协议中标记每台计算机的地址,通常用于十进制来表示,如192.168.1.100,但是在计算机内部,IP地址是一个32位的二进制数值,如11000000 10101000 00000001 00000110(192.168.1.6)。 具体来讲,一个完整的IP地址信息应该包括IP地址、子网掩码、默认网关和DNS等四部分。只有这四部分协同工作,才能与互联网中的计算机相互访问。
1> IP地址(一个完整的IP地址由两部分组成,分别是网络号部分和主机号部分。网络号表示其所属的网络段编码,主机号则表示该网段中该主机的地址编码。 按照网络规模的大小,IP地址可以分为A、B、C、D、E五类,其中A、B、C类是3种主要的类型地址,D类地址用于多点广播,E类用于扩展备用地址)
(1).A类IP地址:
一个A类IP地址由1个字节的网络地址和3个字节的主机地址组成,网络地址的最高位必须是"0",地址范围从1.0.0.0~126.0.0.0。
(2).B类IP地址:
一个B类IP地址由2个字节的网络地址和2个字节的主机地址组成,网络地址的最高位必须是"10",地址范围从128.0.0.0~191.255.255.255。
(3).C类IP地址:
一个C类IP地址由3个字节的网络地址和1个字节的主机地址组成,网络地址的最高位必须是"110",地址范围从192.0.0.0~223.255.255.255。
(4).D类IP地址:
用于多点广播(Multicast)。D类IP地址第一个字节以"10"开始,它是一个专门保留的地址;它并不指向特定的网络,目前这一类地址被用在多点广播中。多点广播地址用来依次寻址一组计算机,它标识共享同一协议的一组计算机。
(5).E类IP地址:
以"10"开始,为将来使用保留,全"0"(0.0.0.0)IP地址对应于当前主机;全"1"的IP地址(255.255.255.255)是当前子网的广播地址。
2> 子网掩码(子网掩码是与IP地址结合使用的一种技术)
主要作用有两个:1)用于确定IP地址中的网络号和主机号;2)用于将一个大的IP网络划分为若干小的子网络。
3> 默认网关(默认网关意为一台主机如果找不到可用的网关,就把数据包发送给默认指定的网关,由这个网关来处理数据包)
4>DNS(DNS服务器用于将用户的域名请求转换为IP地址)
算机的IP地址一旦被分配,可以说是固定不变的。 【命令行提示符】窗口中输入"ipconfig",按Enter键,即可显示出本机的IP配置相关信息。
3.端口介绍
1> 端口的分类按端口号来说,可以分为三大类:公认端口、注册端口、动态和/或私有端口
1)公认端口(公认端口的区间为0~1023,这种端口紧密绑定于一些服务。例如,80端口就总是HTTP通信。)
2) 注册端口(注册端口的区间为1024~49151,这种端口松散绑定于一些服务。可以解释为,有许多服务绑定于这些端口,但同样这些端口用于许多其他目的。例如,许多动态处理端口从1024左右开始)
3) 动态/私有端口(动态和/或私有端口的区间为49152~65535,理论上,不应为服务分配这些端口;实际上,机器通常从1024起分配动态端口。也有一些特例,比如,SUN的RPC端口从32768开始)
2> 常见的端口号及其功能
1)80端口号(80端口是为HTTP协议开放的,是HTTP协议的默认端口,用于网页浏览。在输入网站时,用户输入百度一下,你就知道,其实是访问百度一下,你就知道,因为位于网址后端的端口号是由浏览器自动补全的)
2)8080端口号(8080端口,经常在访问某个网站或使用代理服务器的时候用得到,主要还是用于代理服务)
3)21端口号(21端口主要用于文件传输协议(FTP)服务,是FTP的默认端口。用于传输控制信息(而20端口可能同样会在FTP中用到,只不过20端口用到时只用于传输数据)。 注:文件传输协议(FTP):主要是为了在两台计算机之间实现文件的上传与下载)
4)23端口号(23端口是telnet(远程登录)的端口,是Internet上普遍采用的登录和仿真程序,主要用于远程登录。 注:Telnet协议:是TCP/IP协议族中的一员,是Internet远程登录服务的标准协议和主要方式)
在终端使用者的电脑上使用telnet程序,用它连接到服务器。终端使用者可以在telnet程序中输入命令,这些命令会在服务器上运行,就像直接在服务器的控制台上输入一样。可以在本地就能控制服务器。要开始一个telnet会话,必须输入用户名和密码来登录服务器。
5)25端口号(25端口为简单邮件传输协议(SMTP)服务器所开放,主要用于发送邮件。 注:简单邮件传输协议(SMTP):一种提供可靠且有效的电子邮件传输的协议)
6)53端口号(53端口为域名系统服务协议(DNS)服务器所开放,主要用于域名解析。通过DNS服务器可以实现域名与IP地址之间的转换,只要记住域名就可以快速访问网站。域名系统服务协议 注:域名系统服务协议(DNS):用于域名与 IP 地址的相互转换,以及控制因特网的电子邮件的发送)
4.UDP编程
1> 不同电脑之间的进程如何通信
首要解决的问题是如何唯一标识一个进程,否则通信无从谈起!在1台电脑上可以通过进程号(PID)来唯一标识一个进程,但是在网络中这是行不通的。其实TCP/IP协议族已经帮我们解决了这个问题,网络层的“ip地址”可以唯一标识网络中的主机,而传输层的“协议+端口”可以唯一标识主机中的应用进程(进程)。这样利用ip地址,协议,端口就可以标识网络的进程了,网络中的进程通信就可以利用这个标志与其它进程进行交互
2> 什么是套接字
socket(简称套接字) 是进程间通信的一种方式,它与其他进程间通信的一个主要不同是:它能实现不同主机间的进程间通信,我们网络上各种各样的服务大多都是基于 Socket 来完成通信的. 例如我们每天浏览网页、QQ 聊天、收发 email 等等
3> 创建套接字
在 Python 中 使用socket 模块的函数 socket 就可以完成:
函数 socket.socket 创建一个 socket,该函数带有两个参数:
1)Address Family:可以选择 AF_INET(用于 Internet 进程间通信) 或者 AF_UNIX(用于同一台机器进程间通信),实际工作中常用AF_INET
2)Type:套接字类型,可以是 SOCK_STREAM(流式套接字,主要用于 TCP 协议)或者 SOCK_DGRAM(数据报套接字,主要用于 UDP 协议)
4> 实现UDP双端通信
1)UDP网络程序---发送数据
from socket import *
# 1. 创建udp套接字
udp_socket = socket(AF_INET, SOCK_DGRAM)
# 2. 准备接收方的地址
# '192.168.1.103'表示目的ip地址
# 8080表示目的端口
dest_addr = ('192.168.1.103', 8080) # 注意 是元组,ip是字符串,端口是数字
# 3. 从键盘获取数据
send_data = input("请输入要发送的数据:")
# 4. 发送数据到指定的电脑上的指定程序中
udp_socket.sendto(send_data.encode('utf-8'), dest_addr)
# 5. 关闭套接字
udp_socket.close()
2)UDP通信代码实现
说明:--- 每重新运行一次网络程序,上图中红圈中的数字,不一样的原因在于,这个数字标识这个网络程序,当重新运行时,如果没有确定到底用哪个,系统默认会随机分配
---记住一点:这个网络程序在运行的过程中,这个就唯一标识这个程序,所以如果其他电脑上的网络程序如果想要向此程序发送数据,那么就需要向这个数字(即端口)标识的程序发送即可。
5.TCP编程
1> TCP通信流程
TCP协议,传输控制协议(英语:Transmission Control Protocol,缩写为 TCP)是一种面向连接的、可靠的、基于字节流的传输层通信协议,由IETF的RFC 793定义。
TCP通信需要经过创建连接、数据传送、终止连接三个步骤。TCP通信模型中,在通信开始之前,一定要先建立相关的连接,才能发送数据,类似于生活中,"打电话"。这种连接是一对一的,因此TCP不适用于广播的应用程序,基于广播的应用程序请使用UDP协议。
2> 三次握手和四次挥手
TCP的三次握手(建立连接)和四次挥手(关闭连接)
1.SYN(synchronous建立联机)2.ACK(acknowledgement 确认)3.PSH(push传送)4.FIN(finish结束)5.RST(reset重置)6.URG(urgent紧急)
在TCP/IP协议中,TCP协议提供可靠的连接服务,采用三次握手建立一个连接
(1) 第一次握手:建立连接时,客户端A发送SYN包(SYN=j)到服务器B,并进入SYN_SEND状态,等待服务器B确认。(2) 第二次握手:服务器B收到SYN包,必须确认客户A的SYN(ACK=j+1),同时自己也发送一个SYN包(SYN=k),即SYN+ACK包,此时服务器B进入SYN_RECV状态。(3) 第三次握手:客户端A收到服务器B的SYN+ACK包,向服务器B发送确认包ACK(ACK=k+1),此包发送完毕,客户端A和服务器B进入ESTABLISHED状态,完成三次握手。完成三次握手,客户端与服务器开始传送数据:
采用四次挥手关闭连接:由于TCP连接是全双工的,因此每个方向都必须单独进行关闭。这个原则是当一方完成它的数据发送任务后就能发送一个FIN来终止这个方向的连接。收到一个 FIN只意味着这一方向上没有数据流动,一个TCP连接在收到一个FIN后仍能发送数据。首先进行关闭的一方将执行主动关闭,而另一方执行被动关闭。(1)客户端A发送一个FIN,用来关闭客户A到服务器B的数据传送。(2)服务器B收到这个FIN,它发回一个ACK,确认序号为收到的序号加1。和SYN一样,一个FIN将占用一个序号。(3)服务器B关闭与客户端A的连接,发送一个FIN给客户端A。(4)客户端A发回ACK报文确认,并将确认序号设置为收到序号加1。
tcp注意点:
tcp服务器一般情况下都需要绑定,否则客户端找不到这个服务器
tcp客户端一般不绑定,因为是主动链接服务器,所以只要确定好服务器的ip、port等信息就好,本地客户端可以随机
tcp服务器中通过listen可以将socket创建出来的主动套接字变为被动的,这是做tcp服务器时必须要做的
当客户端需要链接服务器时,就需要使用connect进行链接,udp是不需要链接的而是直接发送,但是tcp必须先链接,只有链接成功才能通信
当一个tcp客户端连接服务器时,服务器端会有1个新的套接字,这个套接字用来标记这个客户端,单独为这个客户端服务
listen后的套接字是被动套接字,用来接收新的客户端的链接请求的,而accept返回的新套接字是标记这个新客户端的
关闭listen后的套接字意味着被动套接字关闭了,会导致新的客户端不能够链接服务器,但是之前已经链接成功的客户端正常通信。
关闭accept返回的套接字意味着这个客户端已经服务完毕
当客户端的套接字调用close后,服务器端会recv解堵塞,并且返回的长度为0,因此服务器可以通过返回数据的长度来区别客户端是否已经下线
6.HTTP协议
1.用户输入网址.2.浏览器请求DNS服务器, 获取域名对应的IP地址.3.请求连接该IP地址服务器.4.发送资源请求. (HTTP协议)5.web服务器接收到请求, 并解析请求, 判断用户意图.6.获取用户想要的资源.7.将资源返回给web服务器程序.8.web服务器程序将资源数据通过网络发送给浏览器.9.浏览器解析请求的数据并且完成网页数据的显示.
2> 域名和DNS
我们在访问一台服务器的时候, 需要记住该服务器的IP地址, 由于IP地址不利于人们记忆, 所以推出的域名技术. 域名是由一串用点分隔的名字组成的 Internet 上某一台计算机或计算机组的名称, 用于在数据传输时标识计算机的位置。域名可以用来表示一个单位、机构或可以利用个人在 Internet上 的确定的名称或位置. 域名是惟一的. 客户可以利用这个名字找寻有关的产品和服务信息。由于我们用域名来标识计算机的位置, 但是我们前面讲过, 网络上标识主机的唯一标识是IP地址, 所以就需要记录一下, 一个域名和IP地址的对应关系, 这个对应关系就存储在DNS服务器中, 当我们向 DNS 发出请求时,DNS会返回给我们域名所对应的IP地址.
3> HTTP介绍(超文本传输协议,是一个基于请求与响应,无状态的,应用层的协议,常基于TCP/IP协议传输数据,互联网上应用最为广泛的一种网络协议,所有的WWW文件都必须遵守这个标准。设计HTTP的初衷是为了提供一种发布和接收HTML页面的方法)
超文本传输协议(HTTP)是万维网应用层的协议,是通过两个程序实现:
-
一个是客户端程序(一般称为浏览器)
-
另一个是服务器 (常称Web服务器)
这两个通常运行在不同的主机上,通过交换HTTP报文来完成网页请求和响应;并且HTTP定义了报文的结构和客户/服务器之间交换报文的规则。
HTTP请求报文格式
HTTP报文是面向文本的,报文中的每一个字段都是一些ASCII码串,各个字段的长度是不确定的。HTTP有两类报文:请求报文和响应报文。
一个HTTP请求报文由请求行(request line)、请求头部(header)、空行和请求数据4个部分组成
1> 请求行
请求行由请求方法字段,url字段(请求资源路径)和HTTP协议版本字段3个字段组成,它们用空格隔开,例:GET /login.html HTTP/1.1
HTTP协议请求方法有GET,POST,PUT,DELETE,HEAD,OPTIONS,TRACE,CONNECT。
常见的请求方法.GET(没有请求体,只有请求行,请求头和空行组成)
状态码:
1xx-->指示信息--代表请求已经接收,继续处理
2xx-->成功--请求已经成功,理解,接受
3xx-->重定向--要求完成请求需要更进一步的操作
4xx-->客户端错误--请求语法错误,或请求无法实现
5xx-->服务器端错误--服务器未能实现合法的请求
常见状态码:
200:客户端请求成功
301:永久重定向
302:临时重定向
400:错误请求
401:未授权
403:禁止访问
404:未找到
405:请求方式有误
500:服务器内部错误
501:未实现
502:错误网关
504:网关超时
505:HTTP版本不支持
2> 响应头
用于描述服务器的基本信息,以及数据的描述,服务器通过这些数据的描述信息,可以通知客户端如何处理响应数据
3>响应体
就是响应时的消息体,数据可以市普通文本,XML,JSON,HTML源码等