(一)协议
协议就是计算机与计算机之间通过网络实现通信事先达成的一种“约定”。这种“约定”使那些由不同厂商的设备、不同的CPU以及不同的操作系统组成的计算机之间,只要遵循相同的协议就能够实现通信。反之,如果使用的协议不同,就无法通信。
分组交换是将大数据分割为一个个叫做包(Packet)的较小单位进行传输的方法。这里所说的包,就如同我们平常在邮局里见到的邮包。分组交换就是将大数据分装为一个个这样的邮包交给对方。
(二)地址
地址:在某一范围内确认的唯一标识符,即数据包传到某一个范围,需要有一个明确唯一的目标地址。
类型
|
层
|
地址
|
说明
|
---|---|---|---|
端口号 | 传输层 | 程序地址 | 同一个计算机中不同的应用程序 |
IP地址 | 网络层 | 主机地址 | 识别TCP/IP网络中不同的主机或路由器 |
MAC地址 | 数据链路层 | 物理地址 | 在同一个数据链路中识别不同的计算机 |
(三)网络构成
构成要素
|
说明
|
---|---|
网卡 | 连入网络必须使用网卡,又称网络接口卡。 |
中继器 | OSI第1层,物理层上延长网络的设备,将电缆的信号放大传给另一个电缆。 |
网桥/2层交换机 | OSI第2层,数据链路层面上连接两个网络的设备,识别数据帧的内容并转发给相邻的网段,根据MAC地址进行处理。 |
路由器/3层交换机 | OSI第3层,网络层面连接两个网络并对分组报文进行转发,根据IP进行处理。 |
4-7层交换机 | 传输层到应用层,以TCP等协议分析收发数据,负载均衡器就是其中一种。 |
网关 | 对传输层到应用层的数据进行转换和转发的设备,通常会使用表示层或应用层的网关来处理不同协议之间的翻译和通信,代理服务器(proxy)就是应用网关的一种。 |
2.3 协议分层与OSI参考模型
协议分层就如同计算机软件中的模块化开发,OSI参考模型的建议是比较理想化的。
OSI参考模型中每个层的作用:
7层通信实例:假设主机A的用户A要给主机B的用户B发送一封电子邮件:
发送方从第7层、第6层到第1层由上至下按照顺序传输数据,而接收端则从第1层、第2层到第7层由下至上向每个上一级分层传输数据。每个分层上,在处理由上一层传过来的数据时可以附上当前分层的协议所必须的“首部”信息。然后接收端对收到的数据进行数据“首部”与“内容”的分离,再转发给上一分层,并最终将发送端的数据恢复为原装。
三、TCP/IP基础知识
3.1 TCP/IP标准化
(1)具体含义
很多人都会认为TCP/IP是指TCP与IP两种协议,实际生活中有时也确实就是指这两种协议。然后,很多情况下,它只是利用IP进行通信时所必须使用到的协议群的统称。
(2)标准化
由于TCP/IP尽早地制定了可行性较强的协议,提出了应对技术快速革新的协议,并及时进行后期改良的方案,因此打败了OSI模型,成为了事实上的标准。
3.2 TCP/IP协议分层模型
tcp和UDP都是传输层协议,tcp:一般用于用于网络上端到端的数据通信,tcp提供可靠传输。
对比:
tcp要先建立会话连接,
UDP不用建立会话, UDP不提供可靠传输。可见UDP比tcp效率高,应用场景也不一样。
举例:1)访问网站要先建立会话,由于返回的数据流往往很大,所以要把数据流分割再传输,就必须基于tcp进行可靠传输避免丢包和进行一系列的包处理。
(2)访问dns服务器得到ip地址,通常一个数据包就能解决,udp就很适合,不用先建立会话。
应用服务和tcp:一般的计算机应用服务都是基于TCP协议,通信两端每一端都有可能有很多基于TCP的服务同时运行,因此为了区分两端的应用服务,每个服务都对应着TCP的一个端口号,例如web服务通常对应着tcp的80端口,服务运行时会监听tcp的80端口(为了好理解,可以理解为,有着80端口标志的tcp协议)。
应用协议和tcp: 例如http协议对应着tcp的80端口,https协议对应着tcp的443端口
http=tcp+80. https=tcp+443。
Tcp/ip协议在osi模型上是四层上三层合并为一层(应用层),数据链路层和物理层合并为链路层。每一层都为上层服务。
现在再来看看主机A向主机B发送一封电子邮件,在TCP/IP模型下的处理过程:
分组数据包经过以太网的数据链路时的大致流程如下图所示:
1、打包数据时,每一层在处理上一层传过来的数据时,会在数据上附上当前层的首部信息后传给下一层;
2、解包数据时,每一层在处理下一层传过来的数据时,会将当前层的首部信息与数据分开,将数据传给上一层。
3、数据通信过程
分层
|
每层的操作
|
---|---|
应用层 | 在数据前面加首部,首部包括数据内容、源地址和目标地址,同时也会处理异常的反馈信息。 |
表示层 | 将特有的数据格式转换为通用的数据格式,同时也会加上表示层的首部信息以供解析。 |
会话层 | 对何时连接,以何种方式连接,连接多久,何时断开等做记录。同时也会加会话层的首部信息。 |
传输层 | 建立连接,断开连接,确认数据是否发送成功和执行失败重发任务。 |
网络层 | 负责将数据发到目标地址,也包含首部信息。 |
数据链路层 | 通过物理的传输介质实现数据的传输。 |
物理层 | 将0/1转换成物理的传输介质,通过MAC地址进行传输。 |
记一次数据发送:当应用层产生数据交互时,http协议会对数据进行包装和处理说明,
1.传输层:保证端到端的数据能够正确传输(比如PC浏览器和服务器80端口通信),由于传输数据大小有限制,传输层会把应用层的数据进行分段、编号、等一系列处理,分多块传输,具有出错重传、流量控制功能,到达另一端后会根据编号重组数据,给应用层解析。
2.网络层:传输层分割后的数据段给网络层传输,网络层把数据段装成ip数据包并编号进行传输,ip包由:首部 +源ip+目标ip+传输层数据段,组成。负责把数据包从源ip传送到目标ip, 不提供可靠传输(例如丢包),只具有传输功能。网络节点之间的传输需要识别MAC地址,同一网段中ARP协议通过广播方式获取目标MAC地址或者网关的MAC地址。在传输的路由上Rip协议可以广播的方式找到下一步的传输路由地址,路由器具有学习功能会把地址加入路由表(也叫动态路由),RARP协议和ARP相反:可根据物理地址得到ip地址。
3.ICMP协议可检测网络层的状况,比如ping命令就是基于ICMP协议
4.IGMP协议是 组播-多播,一般用于流媒体例如,客户端绑定一个多播地址并建立连接,就可以观看源信息流。
5.数据链路层:都知道:我们一般网络传输都是从局域网到以太网的跨网段传输,之间必然是点到点的传输,最终到达目标Ip,点到点之间的传输需要识别MAC地址,ip包不能直接传输,因为ip包没有MAC地址,所以还需要封装成数据帧才能正确传输,如果ip包过大会先分为数据片并编号,然后再包装成数据帧传输到达目标IP后再重组,数据帧: 帧首部+源MAC地址+目标MAC地址+ip包+FSC(帧效验:效验数据帧的完整性)
socket套接字 API 讲解:
基于 TCP 的套接字编程的所有客户端和服务器端都是从调用socket 开始,它返回一个套接字描述符。客户端随后调用connect 函数,服务器端则调用 bind、listen 和accept 函数。套接字通常使用标准的close 函数关闭,但是也可以使用 shutdown 函数关闭套接字。下面针对套接字编程实现过程中所调用的函数进程分析。以下是基于 TCP 套接字编程的流程图:
TCP 通信过程中各步骤的状态图
三次握手
socket 函数
套接字是通信端点的抽象,实现端对端之间的通信。与应用程序要使用文件描述符访问文件一样,访问套接字需要套接字描述符。任何套接字编程都必须调用socket 函数获得套接字描述符,这样才能对套接字进行操作。
connect 函数
在处理面向连接的网络服务时,例如 TCP ,交换数据之前必须在请求的进程套接字和提供服务的进程套接字之间建立连接。TCP 客户端可以调用函数connect 来建立与 TCP 服务器端的一个连接。
TCP 客户端在调用函数 connect 前不必非得调用 bind 函数,因为内核会确定源 IP 地址,并选择一个临时端口作为源端口号。若 TCP 套接字调用connect 函数将建立 TCP 连接(执行三次握手),而且仅在连接建立成功或出错时才返回
bind 函数
调用函数 socket 创建套接字描述符时,该套接字描述符是存储在它的协议族空间中,没有具体的地址,要使它与一个地址相关联,可以调用函数bind 使其与地址绑定。客户端的套接字关联的地址一般可由系统默认分配,因此不需要指定具体的地址。若要为服务器端套接字绑定地址,可以通过调用函数 bind 将套接字绑定到一个地址。
对于 TCP 协议,调用 bind 函数可以指定一个端口号,或指定一个 IP 地址,也可以两者都指定,还可以都不指定。若 TCP 客户端或服务器端不调用bind 函数绑定一个端口号,当调用connect 或 listen 函数时,内核会为相应的套接字选择一个临时端口号。一般 TCP 客户端使用内核为其选择一个临时的端口号,而服务器端通过调用bind 函数将端口号与相应的套接字绑定。
listen 函数
在编写服务器程序时需要使用监听函数 listen 。服务器进程不知道要与谁连接,因此,它不会主动地要求与某个进程连接,只是一直监听是否有其他客户进程与之连接,然后响应该连接请求,并对它做出处理,一个服务进程可以同时处理多个客户进程的连接。
accept 函数
accept 函数由 TCP 服务器调用,用于从已完成连接队列队头返回下一个已完成连接。如果已完成连接队列为空,那么进程被投入睡眠。该函数的返回值是一个新的套接字描述符,返回值是表示已连接的套接字描述符,而第一个参数是服务器监听套接字描述符。
close 和 shutdown 函数
当要关闭套接字时,可使用 close 和 shutdown 函数
参考: