来自 技术 2019-04-17 00:00 的文章

#8 Python网络编程(一) - MinuteSheep

前言

语言是用来交流的,人类语言使人与人交流,编程语言使人与机器交流,那么问题来了,机器如何与机器交流。你是否疑惑过:为什么我们可以使用浏览器查资料、为什么我们可以使用聊天软件聊天、为什么我们可以通过网络传输文件.etc。会与机器交流的人是少部分的,正是这少部分人让几乎所有人方便的使用网络,对于这所有人来说,他们想要聊天,只需要打开一个聊天窗口,输入文字,然后发送即可,他们并不会关注其背后的具体过程,因为背后的过程是复杂的,是由少部分人完成的。通过这本次系列的学习,你将成为少部分人!

一、网络编程概念1.1 网络编程概念

网络编程听起来很高大上,但其实质就是进程之间的通信。再说的直白点,就是软件间的通信,可以是同一计算机的同一软件、同一计算机的不同软件、不同计算机的不同软件、不同计算机的同一软件。(看到这里,应该大概明白了进程就是软件了哇)

二、网络编程先修知识2.1 计算机网络五层协议体系结构

为了介绍网络原理,通常习惯将计算机网络分为五层协议体系结构,从下至上分别为:物理层、数据链路层、网络层、运输层、应用层。

2.1.1 应用层

应用层是体系结构的最高层。直接为用户的应用进程提供服务,主要任务是通过应用进程间的交互来完成特定的网络应用。应用层协议定义的是应用进程间通信和交互的规则。

应用层的协议很多,例如大家熟知的HTTP协议、DNS、SMTP协议、FTP等等

『防抄袭:读者请忽略这段文字,文章作者是博客园的MinuteSheep』

2.1.2 运输层

运输层的主要任务是负责向两台主机中进程之间的通信提供通用的数据传输服务。

运输层主要有以下两种协议:

传输控制协议TCP(Transmission Control Protool)—— 提供面向连接的、可靠的数据传输服务

用户数据协议UDP(User Datagram Protool)—— 提供无连接的、尽最大努力的数据传输服务

2.1.3 网络层

网络层负责为分组交换网上的不同主机提供通信服务。

网络层最常用的协议为IP(Internet Protool)协议

2.1.4 数据链路层

两台主机之间的数据传输,总是在一段一段的链路上传送的,这就需要使用专门的链路层协议。

2.1.5 物理层

物理层主要的任务是传送比特流。

2.2 图解数据在各层之间的传递过程

上图是从《计算机网络》(第七版,谢希仁)扫描下来的,这幅图显示了整个计算机网络体系的传递过程。

假定主机1的应用进程AP1向主机2的应用进程AP2传送数据。AP1先将其数据交给本主机的第5层(应用层)。第5层加上必要的控制信息H5就变成了下一层的数据单元。第4层(运输层)收到这个数据单元后,加上本层的控制信息H4,在交给第3层(网络层),成为第3层的数据单元。一次类推,不过到了第2层(数据链路层)后,控制信息被分为两部分,分别加到本层数据单元的首部(H2)和尾部(T2);而第1层(物理层)由于是比特流的传送,所以不在加上控制信息。

当这串的比特流离开主机1经网络的物理媒体传送到路由器时,就从路由器的第1层依次上升到第3层。每层都根据控制信息进行必要的操作,然后将控制信息剥去,将该层剩下的数据单元上交给更高的一层。当分组上升到了第3层时,就根据首部中的目的地址查找路由器中的转发表,找出转发分组的接口,然后往下传送到第2层,加上新的首部和尾部后,再到最下面的第1层,然后在物理媒体上把每-个比特发送出去。

当这一串的比特流离开路由器到达目的站主机2时,就从主机2的第1层按照上面讲过的方式,依次上升到第5层。最后,把应用进程AP1发送的数据交给目的站的应用进程AP2。

『防抄袭:读者请忽略这段文字,文章作者是博客园的MinuteSheep』

2.3 TCP/IP简介

了解了上面五层网络体系结构之后,两台主机之间想要通信,那么最重要的问题就是:要给谁发?怎么发?发送的信息是否可以没有任何错误的到达?

2.3.1 IP协议

为了解决要给谁发?怎么发的问题,IP协议就诞生了。

为每一台计算机做了标识,这个标识就是IP地址,例如233.233.233.233,有了这个标识,就可以知道给谁发送了IP协议负责将数据从一台主机发送到另一台主机。发送方式是将数据划分为一段一段的,以IP包的形式发出去2.3.2 TCP协议

发是能发了,但是能不能无差错的送到对方手中,又成了一个难题,TCP的诞生解决了这个问题:

TCP是建立在IP协议之上的TCP通过3次握手的方式建立连接,然后对IP包进行编号,保证每个IP包可以顺利发送到对方手中,如果有一个包出现差错,就重新发送这个包

上图就是TCP建立连接(三次握手