网络通信

关于网络的通信这块,跟大家分享一下。

常用服务器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,因此服务器可以通过返回数据的长度来区别客户端是否已经下线