网络通信
关于网络的通信这块,跟大家分享一下。
常用服务器ftp、ssh
1. Linux常用服务器构建-ftp服务器
FTP 是File Transfer Protocol(文件传输协议)的英文简称,而中文简称为“文传协议”。
用于Internet上的控制文件的双向传输。
在FTP的使用当中,用户经常遇到两个概念:"下载"(Download)和"上传"(Upload)。
同时,它也是一个应用程序(Application)。基于不同的操作系统有不同的FTP应用程序,而所有这些应用程序都遵守同一种协议以传输文件。
"下载"文件就是从远程主机拷贝文件至自己的计算机上;
"上传"文件就是将文件从自己的计算机中拷贝至远程主机上。用Internet语言来说,用户可通过客户机程序向(从)远程主机上传(下载)文件。
2. Linux常用服务器构建-ssh和scp
ssh介绍
SSH为Secure Shell的缩写,由 IETF 的网络工作小组(Network Working Group)所制定;SSH 为建立在应用层和传输层基础上的安全协议。
SSH是目前较可靠,专为远程登录会话和其他网络服务提供安全性的协议。常用于远程登录,以及用户之间进行资料拷贝。
远程拷贝文件,scp -r 的常用方法:
使用格式:
scp [-r] 目标用户名@目标主机IP地址:/目标文件的绝对路径 /保存到本机的绝对/相对路径
vi简介
vi是“Visual interface”的简称,它在Linux上的地位就仿佛Edit程序在DOS上一样。它可以执行输出、删除、查找、替换、块操作等众多文本操作,而且用户可以根据自己的需要对其进行定制。Vi不是一个排版程序,它不象Word或WPS那样可以对字体、格式、段落等其他属性进行编排,它只是一个文本编辑程序。 vi没有菜单,只有命令,且命令繁多。
Vi有三种基本工作模式:
+ 命令模式
+ 文本输入模式
+ 末行模式。
命令行模式
任何时候,不管用户处于何种模式,只要按一下ESC键,即可使Vi进入命令模式;
我们在shell环境(提示符为$)下输入启动Vi命令,进入编辑器时,也是处于该模式下。
在该模式下,用户可以输入各种合法的Vi命令,用于管理自己的文档。
此时从键盘上输入的任何字符都被当做编辑命令来解释,若输入的字符是合法的Vi命令,
则Vi在接受用户命令之后完成相应的动作。但需注意的是,所输入的命令并不在屏幕上显示出来。
若输入的字符不是Vi的合法命令,Vi会响铃报警。
文本输入模式
在命令模式下输入插入命令i、附加命令a 、打开命令o、修改命令c、
取代命令r或替换命令s都可以进入文本输入模式。在该模式下,
用户输入的任何字符都被Vi当做文件内容保存起来,并将其显示在屏幕上。
在文本输入过程中,若想回到命令模式下,按键ESC即可。
末行模式
末行模式也称ex转义模式。在命令模式下,用户按“:”键即可进入末行模式下,
此时Vi会在显示窗口的最后一行(通常也是屏幕的最后一行)显示一个“:”
作为末行模式的提示符,等待用户输入命令。
多数文件管理命令都是在此模式下执行的(如把编辑缓冲区的内容写到文件中等)。
末行命令执行完后,Vi自动回到命令模式。
进入编辑模式。
命令 含义
i和I i在光标前插入,I在行首插入。
a和A a在光标后插入,A在行末插入.
o和O o在光标所在行下一行插入,O在光标所在行上一行插入.
命令模式中移动光标
命令 含义
h 光标向左移动
j 光标向下移动
k 光标向上移动
l 光标向右移动
H、M、L 光标移动到到可见屏幕第一行(H)、中间行(M)、最后一行(L)
^和$ ^移动到行首,$移动到行末
G和gg G文档最后一行,gg文档第一行
ctrl+f、ctrl+b 向前翻屏、向后翻屏
ctrl+d、ctrl+u 向前半屛、向后半屛
{ 和 } {向上移动一段,}向后移动一段
w和b w向前移动一个单词,b向后移动一个单词
删除命令
命令 含义
X和x x删除光标后一个字符,X删除光标前一个字符,包含光标位置字符
dd和n dd dd删除所在行,5 dd删除指定行数
d0和D d0删除光标前本行所有内容,D删除光标后本行所有内容,包含光标位置字符
dw 删除光标所在位置的字,包含光表所在位置字符
u 一步一步撤销
ctrl + r 反撤销
. 重复执行上一次操作的命令
>> 文本行右移动
<< 文本行左移动
yy、n yy、y$ y^ yy复制当前行,5 yy复制5行
p 在光标所在位置向下新开一行粘贴
命令模式下,r和R r替换当前字符,R替换光标后的字符
末行模式下,/ + str n查找下一个,N查找前一个
末行模式下,%s/abc/123/g 将文件中所有abc替换为123
末行模式下,1, 10s/abc/123/g 将第一行至第10行之间的abc替换成123
2. IP地址的概念
IP 地址是指互联网协议地址(英语:Internet Protocol Address,又译为网际协议地址), 是IP Address的缩写。IP 地址是IP协议提供的一种统一的地址格式.
IP 地址被用来给 Internet 上的电脑一个编号。大家日常见到的情况是每台联网的PC上都需要有 IP 地址, 才能正常通信。我们可以把 "个人电脑" 比作 "一台电话",那么 "IP地址" 就相当于 "电话号码".
3. ip地址的作用
ip地址:用来在网络中标记一台电脑,比如192.168.1.1;在本地局域网上是唯一的。
子网掩码(了解)
IP 地址的网络号和主机号各是多少位呢?如果不指定,就不知道哪些位是网络号、哪些是主机号?
答: 子网掩码.
子网掩码(subnet mask)又叫网络掩码、地址掩码、子网络遮罩,它是一种用来指明一个IP地址的哪些位标识的是主机所在的子网,以及哪些位标识的是主机的位掩码。子网掩码不能单独存在,它必须结合IP地址一起使用。子网掩码只有一个作用,就是将某个IP地址划分成网络地址和主机地址两部分.
子网掩码是一个32位地址,用于屏蔽IP地址的一部分以区别网络标识和主机标识,并说明该IP地址是在局域网上,还是在远程网上。
子网掩码——屏蔽一个IP地址的网络部分的 "全1" 比特模式.
对于A类地址来说,默认的子网掩码是255.0.0.0; 对于B类地址来说默认的子网掩码是 255.255.0.0,
对于C类地址来说默认的子网掩码是255.255.255.0.
什么是端口
"端口"是英文port的意译,可以认为是设备与外界通讯交流的出口。
端口可分为虚拟端口和物理端口,其中虚拟端口指计算机内部或交换机路由器内的端口,不可见。
实际上是通过“IP地址+端口号”来区分不同的服务的。 需要注意的是,端口并不是一一对应的。
比如你的电脑作为客户机访问一台WWW服务器时,WWW服务器使用“80”端口与你的电脑通信,
但你的电脑则可能使用“3457”这样的端口。
网络传输方式
网络通信中根据数据发送方法进行多种分类. 分类方法主要分为两种:
面向有连接型,面向无连接型.
面向无连接型:UDP
面向无连接型则 不要求建立和断开连接. 发送端可于任何时候*发送数据.
反之, 接收端也永远不知道自己会在何时从那里接收到数据. 因此,
面向无连接的情况下, 接收端需要时常确认是否收到了数据.
UDP 不提供复杂的控制机制, 如果传输过程中出现丢包, UDP 也不负责重发. 甚至当出现包到达顺序乱掉时候也没有纠正的功能. 由于 UDP 面向无连接, 它可以随时发送数据. 再加上 UDP 本身的处理既简单又高效, 因此常用于以下几个方面:
包总量较少的通信(DNS).
视频、音频等多媒体通信(即时通信).
限定于 LAN 等特定网络中的应用通信.
广播通信(广播、多播).
UDP通信模型
面向有连接型:TCP
面向有连接型中, 在发送数据之前, 需要在收发主机之间建立一条连接通信线路.
面向连接就好像我们平时打电话, 输入完对方的电话号码拨出之后, 只有对方拿起电话确认连接才能
进行真正的通话, 通话结束后将电话机扣上就如同切断电源。因此在面向有连接的方式下,
必须在通信传输前后, 专门进行建立和断开连接的处理.
TCP 提供一种面向连接的通信服务, 只有在确认通信对端存在时才会收发数据,
从而可以控制通信流量的浪费. TCP 提供了数据传输时的各种控制功能, 丢包时可以进行重发控制,
还可以将次序乱掉的分包进行顺序控制.
TCP 协议, 传输控制协议是一种面向连接的、可靠的、基于字节流的传输层通信协议.
TCP的特点:
可靠传输
1)TCP采用发送应答机制
TCP发送的每个报文段都必须得到接收方的应答才认为这个TCP报文段传输成功
2)超时重传
发送端发出一个报文段之后就启动定时器,如果在定时时间内没有收到应答就重新发送这个报文段。
TCP为了保证不发生丢包,就给每个包一个序号,同时序号也保证了传送到接收端实体的包的按序接收。
然后接收端实体对已成功收到的包发回一个相应的确认(ACK);
如果发送端实体在合理的往返时延(RTT)内未收到确认,那么对应的数据包就被假设为已丢失将会被进行重传。
3)错误校验
TCP用一个校验和函数来检验数据是否有错误;在发送和接收时都要计算校验和。
4) 流量控制和阻塞管理
流量控制用来避免主机发送得过快而使接收方来不及完全收下。
Tcp通信模型:
两者的区别:
TCP 用于有必要实现可靠传输的情况. 由于它是面向有连接并具备顺序控制、重发控制等机制的,
所以他可以为应用提供可靠的传输.
在多播与广播通信中也使用 UDP, 而不是 TCP. 因此, TCP 和 UDP 应该根据应用的目的按需使用.
选择 UDP 必须要谨慎, 在网络质量令人十分不满意的环境下, UDP协议数据包丢失会比较严重.通常音频,视频在传送时使用UDP较多。
socket(简称 套接字)
是支持TCP/IP的网络通信的基本操作单元,
可以看做是不同主机之间的进程进行双向通信的端点,简单的说就是通信的两方的一种约定,用套接字中的相关函数来完成通信过程。
socket起源于Unix,而Unix/Linux基本哲学之一就是“一切皆文件”,对于文件用【打开】【读写】【关闭】模式来操作。socket就是该模式的一个实现,socket即是一种特殊的文件,
一些socket函数就是对其进行的操作(读/写IO、打开、关闭)
在 Python 中 使用socket 模块的函数 socket 就可以完成:
import socket
socket.socket(AddressFamily, Type)
函数 socket.socket 创建一个 socket,该函数带有两个参数:
参数一:AddressFamily(地址簇)
socket.AF_INET IPv4(默认) socket.AF_INET6 IPv6
socket.AF_UNIX 只能够用于单一的Unix系统进程间通信
参数二:Type(类型)
socket.SOCK_STREAM 流式socket , for TCP (默认)
socket.SOCK_DGRAM 数据报式socket , for UDP
网络程序-发送、接收数据
编码和解码
文本总是Unicode,由str类型进行表示,二进制数据使用bytes进行表示
网络中数据的传输是以二进制(字节码)的方式来进行的,所以我们需要通过对Unicode字符串内容进行编码和解码才能达到数据传输的目的
在Python中:
str->bytes:encode编码 编码就是将字符串转换成字节码,涉及到字符串的内部表示
bytes->str:decode解码 解码就是将字节码转换为字符串,将比特位显示成字符。
其中decode()与encode()方法可以接受参数,其声明分别为:
bytes.decode(encoding="utf-8", errors="strict") str.encode(encoding="utf-8", errors="strict")
其中的encoding是指在解码编码过程中使用的编码(此处指“编码方案”是名词),errors是指错误的处理方案。
tcp注意点:
tcp服务器一般情况下都需要绑定端口和IP,否则客户端找不到这个服务器
tcp客户端一般不绑定,因为是主动链接服务器,所以只要确定好服务器的ip、port等信息就好,本地客户端可以随机
tcp服务器中通过listen可以将socket创建出来的主动套接字变为被动的,这是做tcp服务器时必须要做的
当客户端需要链接服务器时,就需要使用connect进行链接,udp是不需要链接的而是直接发送,但是tcp必须先链接,只有链接成功才能通信
当一个tcp客户端连接服务器时,服务器端会有1个新的套接字,这个套接字用来标记这个客户端,单独为这个客户端服务
listen后的套接字是被动套接字,用来接收新的客户端的链接请求的,而accept返回的新套接字是标记这个新客户端的
关闭listen后的套接字意味着被动套接字关闭了,会导致新的客户端不能够链接服务器,但是之前已经链接成功的客户端正常通信。
关闭accept返回的套接字意味着这个客户端已经服务完毕
当客户端的套接字调用close后,服务器端会recv解堵塞,并且返回的长度为0,因此服务器可以通过返回数据的长度来区别客户端是否已经下线