学海无涯

程序员的自我修养(2)——计算机网络 - 第4张 | 快课网

(转)计算机网络基础

原文地址-程序员的自我修养(2)计算机网络

几乎所有的计算机程序,都会牵涉到网络通信。因此,了解计算机基础网络知识,对每一个程序员来说都是异常重要的。   本文在介绍一些基础网络知识的同时,给出了一些高质量的系列文章链接,以方便大家随时参考学习。相信通过本文的学习,你能对计算机网络有全面的认识!

在阅读本文之前,建议阅读以下两遍文章,以便对”计算机网络是如何工作”的有个大概的了解。 互联网协议入门(一) 互联网协议入门(二)

接下来,我们介绍一些基础网络知识。   OSI参考模型   一上来就是OSI七层参考模型,是不是有点晕?如果是,那先阅读文章开头推荐的那两篇文章吧! 程序员的自我修养(2)——计算机网络 - 第1张 | 快课网 **  第7层:应用层(ApplicationLayer)**   应用层能与应用程序界面沟通,以达到展示给用户的目的。在此常见的协议有:HTTP,HTTPS,FTP,TELNET,SSH,SMTP,POP3等。 **  第6层:表示层(PresentationLayer)**   表示层能为不同的客户端提供数据和信息的语法转换内码,使系统能解读成正确的数据。同时,也能提供压缩解压、加密解密。 **  第5层:会话层(SessionLayer)**   会话层用于为通信双方制定通信方式,并创建、注销会话(双方通信)。 **  第4层:传输层(TransportLayer)**   传输层用于控制数据流量,并且进行调试及错误处理,以确保通信顺利。而发送端的传输层会为分组加上序号,方便接收端把分组重组为有用的数据或文件。 **  第3层:网络层(NetworkLayer)**   网络层的作用是决定如何将发送方的数据传到接收方。该层通过考虑网络拥塞程度、服务质量、发送优先权、每次路由的耗费来决定节点X到节点Y的最佳路径。我们熟知的路由器就工作在这一层,通过不断的接收与传送数据使得网络变得相互联通。 **  第2层:数据链路层(DatalinkLayer)**   首先数据链路层的功能在于管理第一层的比特数据,并且将正确的数据发送到没有传输错误的路线中。创建还有辨认数据开始以及退出的位置同时予以标记。另外,就是处理由数据受损、丢失甚至重复传输错误的问题,使后续的层级不会受到影响,所以它运行数据的调试、重传或修正,还有决定设备何时进行传输。设备有:Bridge桥接器switch交换器 **  第1层:物理层(PhysicalLayer)**   物理层定义了所有电子及物理设备的规范。其中特别定义了设备与物理媒介之间的关系,这包括了针脚、电压、线缆规范、集线器、中继器、网卡、主机适配器(在SAN中使用的主机适配器)以及其他的设备的设计定义。因为物理层传送的是原始的比特数据流,即设计的目的是为了保证当发送时的信号为二进制“1”时,对方接收到的也是二进制“1”而不是二进制“0”。因而就需要定义哪个设备有几个针脚,其中哪个针脚发送的多少电压代表二进制“1”或二进制“0”,还有例如一个bit需要持续几微秒,传输信号是否在双向上同时进行,最初的连接如何创建和最终如何终止等问题。   为了更好理解物理层与数据链路层之间的区别,可以把物理层认为是主要的,是与某个单一设备与传输媒介之间的交互有关,而数据链路层则更多地关注使用同一个通讯媒介的多个设备(例如,至少两个设备)之间的互动。物理层的作用是告诉某个设备如何传送信号至一个通讯媒介,以及另外一个设备如何接收这个信号(大多数情况下它并不会告诉设备如何与通讯媒介相连接)。有些过时的物理层标准如RS-232倒是的确使用物理线缆来控制通讯媒介的接入。   物理层的主要功能和提供的服务如下: 在设备与传输媒介之间创建及终止连接。 参与通讯过程使得资源可以在共享的多用户中有效分配。例如,冲突解决机制和流量控制。 对信号进行调制或转换使得用户设备中的数字信号定义能与信道上实际传送的数字信号相匹配。这些信号可以经由物理线缆(例如铜缆和光缆)或是无线信道传送。

  TCP/IP的5层模型   相比于OSI的七层模型,更常用的是TCP/IP的5层模型。TCP/IP的5层模型是将ISO的七层模型的应用层、表示层、会话层合并为应用层,得到如下图所示的五层模型: 程序员的自我修养(2)——计算机网络 - 第2张 | 快课网   TCP/IP通信的三次握手、四次挥手 程序员的自我修养(2)——计算机网络 - 第3张 | 快课网 **  三次握手:**   第一次握手:客户端发送syn包(syn=x)到服务器,并进入SYN_SEND状态,等待服务器确认;   第二次握手:服务器收到syn包,必须确认客户的SYN(ack=x+1),同时自己也发送一个SYN包(syn=y),即SYN+ACK包,此时服务器进入SYN_RECV状态;   第三次握手:客户端收到服务器的SYN+ACK包,向服务器发送确认包ACK(ack=y+1),此包发送完毕,客户端和服务器进入ESTABLISHED状态,完成三次握手。   握手过程中传送的包里不包含数据,三次握手完毕后,客户端与服务器才正式开始传送数据。理想状态下,TCP连接一旦建立,在通信双方中的任何一方主动关闭连接之前,TCP连接都将被一直保持下去。 **  与建立连接的“三次握手”类似,断开一个TCP连接则需要“四次握手”。**   第一次挥手:主动关闭方发送一个FIN,用来关闭主动方到被动关闭方的数据传送,也就是主动关闭方告诉被动关闭方:我已经不会再给你发数据了(当然,在fin包之前发送出去的数据,如果没有收到对应的ack确认报文,主动关闭方依然会重发这些数据),但是,此时主动关闭方还可以接受数据。   第二次挥手:被动关闭方收到FIN包后,发送一个ACK给对方,确认序号为收到序号+1(与SYN相同,一个FIN占用一个序号)。  第三次挥手:被动关闭方发送一个FIN,用来关闭被动关闭方到主动关闭方的数据传送,也就是告诉主动关闭方,我的数据也发送完了,不会再给你发数据了。  第四次挥手:主动关闭方收到FIN后,发送一个ACK给被动关闭方,确认序号为收到序号+1,至此,完成四次挥手。   戏说TCP/IP状态转化图   TCP/IP协议是计算机网络中的一个协议族,也是网络编程中的重头戏!理解TCP/IP状态转化图,对理解TCP/IP协议的工作过程异常重要。   如下图所示,描述了一个状态机到另一个状态机的转变,已经触发这种状态转变的条件。 程序员的自我修养(2)——计算机网络 - 第4张 | 快课网   状态图详细说明如下:   1.CLOSED:起始点,在超时或者连接关闭时候进入此状态。   2.LISTEN:svr端在等待连接过来时候的状态,svr端为此要调用socket,bind,listen函数,就能进入此状态。此称为应用程序被动打开(等待客户端来连接)。   3.SYN_SENT:客户端发起连接,发送SYN给服务器端。如果服务器端不能连接,则直接进入CLOSED状态。   4.SYN_RCVD:跟3对应,服务器端接受客户端的SYN请求,服务器端由LISTEN状态进入SYN_RCVD状态。同时服务器端要回应一个ACK,同时发送一个SYN给客户端;另外一种情况,客户端在发起SYN的同时接收到服务器端得SYN请求,客户端就会由SYN_SENT到SYN_RCVD状态。   5.ESTABLISHED:服务器端和客户端在完成3次握手进入状态,说明已经可以开始传输数据了。   以上是建立连接时服务器端和客户端产生的状态转移说明。相对来说比较简单明了,如果你对三次握手比较熟悉,建立连接时的状态转移还是很容易理解。   下面,我们来看看连接关闭时候的状态转移说明,关闭需要进行4次双方的交互,还包括要处理一些善后工作(TIME_WAIT状态),注意,这里主动关闭的一方或被动关闭的一方不是指特指服务器端或者客户端,是相对于谁先发起关闭请求来说的:   6.FIN_WAIT_1:主动关闭的一方,由状态5进入此状态。具体的动作是发送FIN给对方。   7.FIN_WAIT_2:主动关闭的一方,接收到对方的FIN-ACK,进入此状态。由此不能再接收对方的数据。但是能够向对方发送数据。   8.CLOSE_WAIT:接收到FIN以后,被动关闭的一方进入此状态。具体动作是接收到FIN,同时发送ACK。   9.LAST_ACK:被动关闭的一方,发起关闭请求,由状态8进入此状态。具体动作是发送FIN给对方,同时在接收到ACK时进入CLOSED状态。   10.CLOSING:两边同时发起关闭请求时,会由FIN_WAIT_1进入此状态。具体动作是接收到FIN请求,同时响应一个ACK。   11.TIME_WAIT:最纠结的状态来了。从状态图上可以看出,有3个状态可以转化成它,我们一一来分析:   a.由FIN_WAIT_2进入此状态:在双方不同时发起FIN的情况下,主动关闭的一方在完成自身发起的关闭请求后,接收到被动关闭一方的FIN后进入的状态。   b.由CLOSING状态进入:双方同时发起关闭,都做了发起FIN的请求,同时接收到了FIN并做了ACK的情况下,由CLOSING状态进入。   c.由FIN_WAIT_1状态进入:同时接受到FIN(对方发起),ACK(本身发起的FIN回应),与b的区别在于本身发起的FIN回应的ACK先于对方的FIN请求到达,而b是FIN先到达。这种情况概率最小。   关闭的4次连接最难理解的状态是TIME_WAIT,存在TIME_WAIT的2个理由:   1.可靠地实现TCP全双工连接的终止。   2.允许老的重复分节在网络中消逝。   MAC地址的概念及其作用 **  MAC地址(MediaAccessControlAddress),媒体访问控制地址,或称为物理地址,是用来定义网络设备的位置的。在OSI模型中,第三层网络层负责IP地址,第二层数据链结层则负责MAC地址。一个主机会有一个IP地址,而每个网络位置会有一个专属于它的MAC地址。   ARP协议的用途及其工作原理 **  地址解析协议AddressResolutionProtocol),其基本功能为通过目标设备的IP地址,查询目标设备的MAC地址,以保证通信的顺利进行。它是IPv4中网络层必不可少的协议,不过在IPv6中已不再适用,并被邻居发现协议(NDP)所替代。   在每台安装有TCP/IP协议的电脑或路由器里都有一个ARP缓存表,表里的IP地址与MAC地址是一对应的,如下表所示。

在pycharm中如何将django中多个app放到同个文件夹apps处理

新建apps文件夹后mark为source目录,然后在Setting中import方式为

from message import views

但这样run manage.py task时会报模块不存在的错误

ImportError: No module named message

此时要在Setting中设置app的路径

sys.path.insert(0,os.path.joinBASE_DIR,'apps'))

注意:此时的 from message import views 必须写在设置路径语句之后 还有记得要注册app哦:)

python2.7无法pip mysql-python的问题

出现问题:

> pip install MySQL-python

_mysql.c(42) : fatal error C1083: Cannot open include file: 'config-win.h': No such file or directory error: command '"C:\Users\fnngj\AppData\Local\Programs\Common\Microsoft\Visual C ++ for Python\9.0\VC\Bin\amd64\cl.exe"' failed with exit status 2

解决方法: 在http://www.lfd.uci.edu/~gohlke/pythonlibs/#mysql-python下载对应的包版本。 然后在命令行执行

pip install MySQL_python-1.2.5-cp27-none-win_amd64.whl

virtualenv各python版本的虚拟环境创建及常用命令说明

win系统

首先

pip install virtualenvwrapper-win

创建py2环境

mkvirtualenv -p C:\python27\python.exe(解释器绝对路径) py2env(虚拟环境名)

创建py3环境

mkvirtualenv -p C:\python34\python.exe(解释器绝对路径) py3env(虚拟环境名)

linux系统

首先也是一样安装virtualenv

pip install virtualenvwrapper

然后确定系统中Python的安装位置,比如我的位置在/usr/bin/下 创建py2环境

virtualenv -p /usr/bin/python2 py2env

创建py3环境

virtualenv -p /usr/bin/python3 py3env

Ubuntu VPS一键搭建SS

此脚本具有以下特色: 一键安装Shadowsocks集成速锐 自定义设置端口设备数量 一键添加多端口用户并设置带宽上限 一键单端口、多端口切换 支持定时重启Shadowsocks 一键安装 BBR 支持 一键封禁 垃圾邮件(SMAP)/BT/PT

复制命令下载并安装SS脚本