网络协议由3部分组成:语义、语法、时序。其中,语义用来解释控制信息每个部分的意义;语法是用户数据与控制信息的结构与格式,以及数据出现的顺序;时序是对事件发生顺序的详细说明。可以这样形象地描述:语义表示要做什么、语法表示要怎么做,时序表示做的顺序。
TCP/IP协议不是TCP和IP协议的合称,是因特网整个网络TCP/IP协议簇。这个协议簇由4个层次组成:网络接口层、网络层、传输层、应用层。
IP是计算机网络相互连接进行通信而设计的协议,位于TCP/IP协议簇结构体系网络层中。IP协议是利用IP地址在主机之间传递信息,这是因特网能够运行的基础。因特网每一台主机都有一个唯一的IP地址。IP(指IPv4)地址的长度为32位(共有2^32个IP地址),分为4段,每段8位,用十进制数字表示,每段数字范围为0-255,段与段之间用句点隔开,比如172.168.1.100。IP地址由网络标识号码与主机标识号码两部分组成。因此IP地址可分为两部分,一部分为网络地址,另一部分为主机地址。IP地址分为A、B、C、D、E五类,适用的类型分别为大型网络、中型网络、小型网络、多目地址、备用,常用的是B和C两类。
端口(既可是指硬件接口、也可是TCP/IP协议中的端口)是计算机与外界进行通信交流的出口。端口号的范围是0-65535,任何由TCP/IP提供的服务皆基于1-1023之间的端口号进行通信,由IANA分配管理。其中,低于255的端口号保留,用于公共应用;255到1023的端口号用于特殊应用;高于1023的端口号称为临时端口号,常用于软件服务。
Python提供网络底层接口的主要来自socket模块。socket也称为"套接字",用于描述IP地址和端口,是一个通信链的句柄,可以用来实现不同计算机之间的通信。套接字是通过地址簇(address family,控制所用OSI网络层协议)和套接字类型(socket type,控制传输层协议)两个主要属性来控制如何发送数据的。套接字地址簇常用的是AF_INET,用于IPv4 Internet寻址。AF_UNIX常量仅在支持UDS的系统上定义。套接字类型默认是SOCK_STREAM。SOCK_STREAM对应传输控制协议(TCP)。TCP传输需要握手或其他设置过程,因此能够确保每条消息只传送一次,而且是按正确顺序传送,从而增加了可靠性,不过会引入额外的延迟。UDP则相反,传送没有顺序,并且可以多次传送或者不传送,适用于对顺序不太重要的协议或者用于广播。
使用TCP的服务器与客户端
TCP是一种面向连接的、可靠的、基于字节流的传输通信协议,由IETF的RFC 793定义。位于IP/TCP模型中的传输层是处在IP层之上、应用层之下的中间层,因此数据传出必须经过IP层。
当应用层向TCP层发送用于网间传输、用8位字节表示的数据流,TCP则把数据流分割成适当长度的报文段,然后将离散的报文组装成比特流。为了保证数据的可靠传输,会将从应用层传送到TCP实体的数据进行监管,并提供了重发机制和流控制。
TCP工作原理
TCP为了保证数据不发生丢失,对传输数据按字节进行了编号,编号的目的是为了保证传送到接收端的数据能够按序接收。接收端会对已经接收的数据发回一个确认。若发送端在规定时间内未收到有编号的数据,则将重新传送前面的数据。
TCP当然并不会像我们一样使用顺序的整数作为数据包的编号,而是通过一个计数器记录发送的字节数。举个例子,如果数据流被切割为几个包,其中某个包大小为1024字节,序号为3600,那么下一个数据包的序号就是4624。这说明网络栈无须记录数据流是如何分割成数据包的。而且TCP初始序列号是随机选择的,这样可以避免TCP序号易于猜测而伪造数据进行欺骗或攻击。
TCP无须按照数据包依次发送,可以一次性发送多个数据包,同时通过发送方传输的数据量大小进行减缓或暂停,即所谓的流量控制。TCP如果发现数据包丢弃,就会减少每秒发送的数据量。
使用Python的socket模块,如何进行TCP通信?使用TCP进行通信首先要从服务器开始,先初始化Socket,然后绑定(bind)端口,对端口进行监听(listen),调用accept阻塞,等待客户端连接。这时如果某个客户端初始化一个Socket,然后连接服务器(connect),如果连接成功,那么客户端与服务器的连接就建立了。客户端发送数据请求,服务器接收请求并处理请求,然后把回应数据发送给客户端,客户端读取数据,最后关闭连接,一次交互结束。
使用UDP的服务器与客户端
UDP(User Datagram Protocol,用户数据报协议)是OSI参考模型中一种无连接的传输层协议,提供面向事务的简单不可靠信息传送服务。
跟TCP协议一样,UDP在网络中用于处理数据包,不过它只负责将应用层的数据发送出去,不具备差错控制和流量控制功能。因此在传送过程中如果数据出错就要由高层协议处理。UDP不需要具备差错控制和流量控制等功能的开销,使得数据传输效率高、延时小、适合用于对可靠性要求不高的应用,比如视频点播、QQ等。
UDP工作原理
UDP使用底层互联网协议传送报文,提供不可靠的无连接的数据包传输服务。UDP在IP报文的协议号为17,其报文是封装在IP数据中进行传输的。UDP报文由UDP源端口字段、UDP目标端口字段、UDP报文长度字段、UDP校验和字段以及数据区组成。首先通过端口机制进行复用和分解,每个UDP应用程序在发送数据报文之前必须与操作系统协商获取相应的协议端口及端口号,然后根据目的端口号进行分解,接收端使用UDP的效验进行确认查看UDP报文是否正确到达了目标主机的相应端口。