网络通信
计算机为了联网,必须规定通信协议,最开始,各个厂商有各自的网络协议,互不兼容。后来,为了全世界不同类型的计算机都能互联,就必须规定一套全球通用的协议。互联网协议簇(Internet Protocol Suite),就是通用协议标准。Internet拆开就是连接网络的意思。
互联网协议有上百种,但最重要的是TCP和IP协议,因此,我们也把互联网协议称为TCP/IP协议。
相互通信的计算机需要知道对方的标识,接入互联网的计算机的标识就是其IP地址,例如123.123.123
。如果一台计算机接入两个或多个网络,它就有可能有多个IP地址,所以,IP地址对应的其实是计算机的网络接口,通常是网卡。
IP地址分IPV4和IPV6
ipv4是一个32位整数,以字符串表示的IP地址是:xxx.xxx.xxx.xxx
,其中,xxx
是小于255的十进制整数,每组8位。以点分隔,称为“点分十进制”。
ipv6是一个128位整数,,以字符串表示的IP地址是:xxxx:xxxx:xxxx:xxxx:xxxx:xxxx:xxxx:xxxx
,例如2001:0db8:85a3:0042:1000:8a2e:0370:7334
。每16位一组,分为8组,每组以16进制表示为4个字符,每个字符占4位。有一组全为0时可省略,冒号不可省略,相邻多组均为0时,均可省略,遵从这种规则,如果因为省略出现了两个以上的冒号,可以合并为一个。这种零压缩在一个地址中只能出现一次(防止歧义)。
- 2001:0DB8:0000:0000:0000:0000:1428:57ab
2001:0DB8:0:0:0:0:1428:57ab
2001:0DB8::0:0:0:1428:57ab
2001:0DB8::0:0:1428:57ab
2001:0DB8::0:0:1428:57ab
2001:0DB8::1428:57ab
以上几组合法且等价,但
2001::0D9e::57ca非法,因为不知道中间省略几组
TCP/IP
IP协议是将两计算机之间要通信的数据分割为一个个的小块,然后通过IP包发出去。由于互联网链路复杂,两台计算机之间通常由多条线路,路由器就负责决定如何把包发出去,IP协议的特点就是按包发送,途径多个路由,包不保证到达,也不一定顺序到达。
TCP协议是建立在IP协议之上的,负责在两台计算机之间建立可靠连接,保证按顺序到达,TCP协议会通过握手建立链接,对分割后的IP包编号,按序发送,如果包掉了,则重新发送。
常用的更高级的通信协议就是建立在TCP协议的基础上的,例如浏览器的HTTP协议,邮件的SMTP协议。
一个普通的TCP报文除了包含要传输的数据之外,还包括源地址,源端口,目标地址,目标端口。
端口有什么用?网络通信是两个计算机之间的通信,本质上来说是两个进程之间的通信,只拥有目标的IP地址是不够的,一个TCP报文来了,是交给浏览器还是QQ,就需要通过端口号进行区分,每个网络程序都会向系统申请唯一的端口号。两个进程在两台计算机之间的连接就需要各自的IP地址和端口号
同时与多个计算机连接的进程还需要向系统申请多个端口号。
建立网络连接的基本步骤
TCP编程
对于服务器来说,先建立socket,指定协议类型,然后为这个socket绑定监听的地址和端口,开始监听。
服务器可能有多块网卡,可以绑定到其中一块网卡的IP地址上。端口号需要指定,不同的端口号代表不同的服务,80
端口是web服务的标准端口。25
是SMTP的标准端口,小于1024的端口号是Internet标准服务端口,大于1024的,可以随意使用。
对于客户端来说,先建立socket,指定协议类型,通过connect指定服务器地址和端口
服务器通过accept接受一个connect连接,每个新连接都必须创建一个线程来处理TCP连接,不然单线程只能接受一个连接,无法在处理一个连接的同时接受其他连接。
UDP编程
UDP协议不需要建立连接,只需要知道对方的地址和端口号,就可直接发送数据包,收不收得到就不知道了 。不可靠,但优点是快。
r服务器端使用recvfrom同时接收数据和客户端地址(这个地址是一个tuple,包括IP地址和端口号,下同)
客户端发送数据使用sendto函数时也传入数据和目标服务器地址。
客户端从服务器接收数据仍然是recv
网友评论