Python网络编程-入门篇
几十年以前人们就一直在寻找计算机之间通信的方式,随着时间的推移一些优秀的通信方式流传下来。比如最流行的TCP/IP,它的英文全称是Transmission Control Protocol /Internet Protocol。TCP/IP是一个协议集合,今天最主要的通信协议就是TCP协议。
在PC上,你经常需要打开浏览器、即时通讯工具等,可能你用的是一个modem或者(A)DSL数据线路在互联网上交换信息,所有PC上的应用程序都共享这一数据线路连接到目的地,通常你无需关注他们如何共享线路。再比较一下打电话和发传真,他们就不能基于这种共享线路的方式运行。
TCP允许你将数据分解成一些比较小的包(packets)通过互联网来发送,然后在互联网的另一端将这些包的数据组合起来。
Addressing
为了使这种基于包模式的传输方式运行起来,有几点TCP需要考虑。首先,需要知道远程计算机的IP地址,这就像你邮寄邮件一样。其次,需要知道与远程计算机的哪一个应用程序通信。比如当打开了两个浏览器和一个聊天工具,计算机如何判断哪一个应用程序来处理接受的信息。通过给每个应用程序一个独立的端口号可以解决这个问题,基于这种模式两端的计算机都拥有了独立的IP地址和端口号。
虽然基于这种设计TCP已经可以顺利工作,但是人们发现记住这些IP地址太难了!于是DNS出现了,当你输入网址www.xugaofan.com建立到远程计算机的连接时,DNS会完成对该网站IP地址的解析工作。在Python中,通常将DNS这一层从程序中隐藏起来,有时候你几乎感觉不到他的存在。
Reliability
TCP是可靠的协议,意味着除了网络不正常的情况,你发送的数据都将完整、有序且原封不动的到达目的地。实现这三点都是基于不同的算法:其中处理数据在传输过程中被修的改通常使用checksum(不太熟悉);处理数据丢失通常需要接受方应答,否则发生方会一直尝试重新发送直到成功或者是它判定为网络连接失败然后向程序中抛出错误,通常这一切是由系统自动处理的。处理数据重复发送或者无序,TCP通常会将一些顺序号与数据包一起发送,接受方通过这些顺序号确保有序地接受和重新组合这些数据。
Routing
通常为了将一个远程数据包发送到你的计算机,需要经过一系列的数据线路。比如通过DSL到电话公司,然后到互联网服务提供商,之后再到你所在城市。在每一个节点,都有其他的计算机参与了数据传输。你可以通过traceroute和mtr来显示你接受的数据在传输时经过了哪些路由设备。
Security
数据包在发送过程可能经过多次转发,被拦截、修改的几率就非常大,因而保证数据包的安全性至关重要。SSL(Secure Sockets Layer)和TSL(Transport Layer Security)是当今最流行的数据安全保护措施。
Using the Client/Server Model
TCP/IP使用client/server的方式通信,在这种模式下,服务端需要持续地监听来自于客户端的请求,并建立连接即时应答。在这种模式下总是客户端主动开始连接而服务端只需要坐着等连接到来。
当你输入www.xugaofan.com的时候你可能会想,如何找到web 服务器的端口号。其实服务器只不过是在一个最常用的譬如80端口进行监听。因此浏览器知道去该地址的80端口寻找信息。
如果你要自己写一个服务器,你应该选一个大于1024小于65536的端口号,这样你与其他程序冲突的几率会大大减少。(端口号必须小于65536)另外在linux系统中只有root用户才有权限请求小于1024的端口,这样某种程度上提供了一定的安全级别。
客户端的端口号就不那么重要了,通常由操作系统随机指派一个可用的端口号。服务端对客户端的端口号没有任何要求。
理解物理传输和以太网
TCP/IP强大的一点就是可以通过很多网络设备进行数据传输,比如以太网、电话线、卫星线路等。这些通信方式的每一种都有自己独特的一些特性。以太网是当今进行物理传输中较为普遍的,它的主要特征之一就是能够对所有联通的节点进行数据广播,利用这一特性可以实现很多有意义的应用。如果以太网内部需要与互联网进行信息交互,则首先要将信息发送到路由器,由路由器来决定数据包的下一个接收点。关于以太网的协议结构可以看看这里:http://www.networkdictionary.net/protocols/ethernet.php
说明:以上文章只是对网络编程的一个简要的概览,没有涉及到严格的定义与规范。而且也只是我对<Foundations of Python Network Programming>一书简要的翻译和学习,如果有不当之处,还请指正。