最近在看python的socket编程,发现一个问题,要写代码,其实入门很简单,但是真正要深入的时候,你会发现怎么会那么多东西的原理不理解,导致要从新再看一些基础的东西,越看越烦,还不得不看,近几日静下心来发现一本很久以前的书《python网络编程基础》,介绍的不错,在此把读书笔记搬上来
1.1 理解TCP基础
TCP/IP是一些协议的集合。
大多数通信使用TCP协议
internet是在共享的线路上发送数据的
web浏览器、QQ、邮件
为了实现共享,TCP通过把要发送的数据流分解成很多小信息包
这些信息包到了接受者会再次合成在一起
信息包很小,用很少的时间来发送每一个比特,而其他程序的信息包也可同时发送
1.1.1 寻址
信息包传送时,TCP要识别远程机器
目的地:通过IP
机器的哪个程序通信:通过端口号
每个TCP的端点就是通过一个IP和一个端口号唯一确定
进一步:
记住一串IP很复杂,出现了DNS
与远程机器连接时,可以申请与该机器IP相对应的DNS,DNS会给你一个IP,就可以连接了
1.1.2 可靠性
打电话会出现噪音,Internet传送数据也会出现错误。
Modem可能改变了数据的几个字节
路由器丢包
系统收到的信息包顺序错误
信息包重复收取
网络断开
TCP是一个可靠的协议
信息包每个都有校验码,保证传输过程中没被修改
TCP要求接收方收到每个包都反馈一下,防止信息丢包
TCP传送一个包就会发一个序号,接收方检查序号,防止重复和顺序混乱
1.1.3 路由
负责接收信息包并决定如何把他们传送到目的地的设备叫路由器
例子:信息包会经过很多不同的网络
信息包通过您的DSL到达电话公司,接着到达您城市的internet服务商,然后经过其他城市最终到达目的地
当路由器断掉,程序会察觉
路由线路拥挤,信息可能丢包,传输性能很慢
1.1.4 安全
信息包在internet传输是通过共享网络传输,可能被修改和拦截
重要数据传输:网上购物时,付款时被拦截而转向了其他主机,卡号和密码就被。。
解决方法:SSL(secure socket layer)和TLS(Transport layer security)
SSL和代码混合在一起,提供服务器的认证、加密和数据完整性
TSL和SSL很相似
1.2 使用客户端/服务器模式
TCP/IP对于客户/服务器类型的通信很有帮助。服务器一直侦听客户端的请求,有请求后,建立连接
服务器端端口号:在C/S下,服务器通常监听一个大家都知道的端口号,如web服务器监听80端口
Linux/Unix系统中,只有ROOT能访问小于1024的端口,如果您编写的服务不在服务器分配列表中,那就选择一个大于1024,最大可以65535的端口,不和其他服务端口冲突
客户端端口号:客户端由OS随机挑选一个
1.3 理解UDP
UDP被用来从一个系统向其他系统传送非常短的消息
只有一个保证:保证接收的数据是完整的。信息是否真的收到,数据是不是只收到一次,信息包的顺序,都不保证;但只要没有受到攻击,通过UDP接收的数据通常都是完整
优点:不提供那么多保证,而TCP建立和关闭连接都要话费时间,而UDP对连接不存在建立和关闭的时间
应用:DNS系统,流式音频视频,许多游戏和网络文件系统(极品飞车和samba)
TCP和UDP的选择
用TCP
可靠的数据传输
协议不止一次请求和应答
发送较多的数据
连接出现短暂延迟可以容忍
UDP:
不关心信息包是否到达或者信息包的顺序
只包括基本的请求和应答
尽快建立连接
只传送很少的数据。UDP限制一个包不超过64K,通常只用UDP传输1KB以下的数据
1.4 物理传输和以太网
一个通过TCP/IP连接以太网的计算机有一个和该网络接口相关的IP
与本地网络机器通信时,直接发送信息
与网外的机器通信,必须发送数据到本地路由,由路由决定发到哪里
为了知道机器是本地还是远程的:
要比较源机器和目的机器的IP的前几位(最有效部分)是不是相同(每个网络接口都有网络掩码表明需要比较几位),如果比较失败,开始的几位不同,那就要经过路由器