为了把世界上所有不同类型的计算机和移动设备都连接起来,就必须规定一套全球通用的协议标准。为了网络互联这个目标,互联网协议簇(Internet Protocol Suite)就随之发展而成,互联网协议簇就是通用协议标准。
因为互联网协议包含了很多种协议标准,并不仅仅只是TCP和IP协议,只是这两个相对来说非常重要,所以互联网通信协议也就简称TCP/IP协议。
7层协议图例
网络通信协议分层模型
在网络分层模型中,有两种模型:
- TCP/IP 标准:1970年被发明。它提出了分层概念,将网络通信分为四层,分别是数据链接层、网络层、传输层、网际应用层。
- OSI:全称叫开放式系统互联通信参考模型,是国际标准,用来统一各种网络协议,始于上世纪70年代后期。OSI 模型分成了七层,分别为物理层、数据链路层、网络层、传输层、会话层、表示层、应用层。
两者的关系就好比手机系统的巨头是 iOS 和 Android,它们制定了标准,因为话语强,所以国际标准以它们为核心再添加指定一些其他标准。其中 TCP/IP 就是网络分层模型中的老大,OSI 就像英国女王那样,是皇室象征,是国际标准。
端口
1. 什么是端口?
大白话来讲,端口就像是一个房子的们,是出入这间房子的必经之路,没有其他路。那什么是进程?进程就是正在进行的程序,当我们打开任务管理器,可以看到进程。进程与进程之间需要交流,交流需要收发网络数据,那么就需要端口。端口可以有65536(2^16)个。
2. 端口号
那么既然有这么多端口,那操作系统为了统一管理,就会对端口进行编号,这就是端口号。
端口是通过端口号来标记的,端口号只有整数,范围【0, 65535】
那么端口号是如何分配的呢?端口号不是随意使用的,而是按照一定的规定进行分配。知名端口也就是众所周知的端口号,范围为【0,1023】,它是计算机内部的保留端口,你写的应用最好不要乱用。动态端口是不固定分配某种服务的端口号,动态分配范围为【1024,65535】,你可以随便玩了。
动态分配是只当一个系统进程应用进程需要网络通信时向主机申请一个端口,主机从可用端口号中分配一个供它使用,当这个进程结束时,其占用的端口号同时释放。
TCP上文提到,进程和进程间的通信需要端口,那么机器和机器间的通信就需要IP:Port。假设我们需要在A电脑的进程发一段数据到B电脑的进程,那么代码我们会使用socket实现。基于Socket的通信方式就2种:TCP和UDP。下图简单的告诉你这2个瓜的区别:突出一点就是TCP可靠,UDP不可靠。早年小马哥的QQ就是基于UDP实现的聊天室。
创建一个连接的代码就下面这样写:
fd = socket(AF_INET,SOCK_STREAM,0);
其中SOCK_STREAM代表的是采用字节流传输数据,其实就是TCP协议。
通过socket调用,我们就创建了一个句柄,其实就是一个32位的整数,通过它我们就可以欢乐地读和写了,比如用bind()绑定IP端口,用connect()发起建连。这里TCP的三次握手我们就不展开了哈,因为它不是我们本文的重点。
握手建立连接流程
成功建立一个fd到fd的链接后,我们就可以使用send()发送数据,recv()接收数据。但是这样一个赤裸裸的TCP连接,可以收发数据,但是远没有这么简单?为啥呢,你就继续往下面读......
TCP是有三个特点,面向连接、可靠(超时和重传保证)、基于字节流。