基础知识
网络分层思想
网络采用分而治之得方法设计,将网络得功能划分为不同的模块,以分层的形式有机的集合在一起。
每层向实现不同的功能,每层向上层提供服务,同时使用下层提供的服务
网络分层的作用
为了让网络功能模块化,便于管理和通信
OSI七层协议模型
OSI模型是一个理想的、通用的但尚未实现的模型
通信特点:
属于对等通信,为了使数据分组从源发出到达目的地源端OSI模型的每一层必须与目的端对应层进行通信。
七层解释
应用层
作用
最靠近用户的一层,为计算机提供应用接口,也为用户提供各种网络协议
表示层
作用
提供各种应用于应用层数据的编码和转换功能,确保一个应用系统发送的数据可以被另一个应用系统识别
会话层
作用
负责建立、管理和终止表示层实体之间的通信会话
传输层
为上层协议提供端到端的可靠透明的数据传输服务,包括差错处理和流量控制
网络层
通过IP寻址来建立两个节点之间的连接,为数据来源的传输层送来分组数据,选择核合适的路由和交换节点
数据链路层
将bit组合成字节,再将字节组合成帧,使用链路层地址访问介质并进行差错检测
物理层
实际上最终信号的传输湿通过物理层实现的
TCP/IP模型
是工业实用模型,是OSI模型的具体应用
与OSI模型的对应关系
应用层:对应OSI模型中的应用层、表示层、会话层
传输层:对应OSI模型中的传输层
网络层:对应OSI模型中的网络层
网络接口和物理层:对应着OSI中的数据链路层和物理层
图示
TCP与UDP
异同
相同点:
桶位传输层协议
不同点:
UDP无连接,不可靠
TCP有连接,可靠
TCP
是一种面向连接的传输层协议,它能提高可靠性通信。即数据无误、数据无丢失、数据无失序、数据无重复到达的通信
适用情况:
适用于对传输质量要求较高、以及传输大量数据的通信
在需要可靠数据传输的场合
软件的用户登录、账号管理相关功能
TCP三次握手
TCP连接均是由客户端连接到服务器,服务器一直处于监听状态,所以是由客户端发起连接
- 客户端发出请求,表示要连接到服务器
- 服务器回应客户端,表示确认可以连接
- 表示可以开始发送数据
TCP四次挥手
由于TCP是全双工的,因此每个方向都必须要单独进行关闭。
- 此时客户端的数据已经发送完毕,客户端首席按发出断开连接信号,等待服务器回应
- 服务器接收到客户端的消息,回应消息。之后服务器会继续发送未传输完毕的数据。
- 服务器数据发送完毕后,会向客户端发出断开连接的消息
- 客户端收到消息予以回应。此时客户端会等待2MSL时间(MSL最长报文段寿命),等待是否收到来自服务器的超时重传请求。
最后等待2MSL时间的作用:
若客户端最后回应服务器的消息丢失,服务器会发送超时重发请求。而这个请求会在2MSL时间内送达客户端,此时客户端会重新发送回应消息,然后再次等待2MSL时间。
UDP
是不可靠的无连接的协议。在数据发送前,因为不需要进行连接,所以可以进行高效的数据传输
虽然UDP是不可靠的传输方式,但是依然可以通过某些手段实现可靠传输,如数据包等。
使用情况:
发送小尺寸数据(如对DNS服务器进行IP地址查询时)
在接收到数据,在给出应答较困难的网络中使用UDP
适用于广播/组播式通信中,流媒体
TCP/IP协议
TCP协议是用来检测网络传输中差错的协议
IP协议是负责随不同网络进行互联的协议
字节序
分类:
大端存储:高位字节存储在低地址端
小端存储:低位字节存储在低地址端
主机字节序指小端存储,网络字节序指大端存储
相关函数:
long是4个字节,short是2个字节
网络字节序转主机字节序:
u_long ntohl(u_long hostlong);
u_short ntohs(u_short hostshort);
主机字节序转网络字节序:
u_long htonl(u_long hetlong);
u_short htons(u_short netshort);
IP
是internet种主机的唯一标识。
分类:
IPV4:32位
IPV5:128位
相关函数:
常用的IP地址使用点分形式十进制标识,但是在一些网络相关函数中,均采用长整型方式。
所以需要一个函数对其进行转换
int_addr_t inet_addr(const char *cp);
参数: cp:点分形式的IP地址
返回值: in_addr:成功返回转换完的地址,默认字节序为大端字节序
注意: 此函数仅适用于IPV4,同时不能用于255.255.255.255的转换
子网掩码
用来指明IP地址中哪些位标识的是主机所在的子网,哪些位来标识主机的位掩码
也就是说:通过IP和子网掩码可以计算该网址对应的网段和主机地址
端口号
用来区分主机接受到的数据包是被那个进程或者线程所调用
注: TCP和UDP的端口是互相独立的
一些端口的分类:
众所周知端口:
1 ~ 1023为众所周知端口(其中1 ~ 255为众所周知端口,256 ~ 1023通常为UNIX所占用)
已登记端口:
1024 ~ 49151
动态或者私有端口:
19152 ~ 65535
网络编程
socket
基本概念:
是一个网络编程接口,独立于具体的网络通信协议
是一个特殊的文件描述符可以使用文件I/O对其进行操作
在OSI模型中主要位于会话层和传输层之间
分类:
流式套接字
字节流、用于TCP协议通信,因此提供面向连接的、可靠的数据传输服务
数据报式套接字
以独立数据包形式发送,不保证差错检测。用于UDP通信,因此提供无连接的传输服务
原始套接字
可以对较低层次协议,如IP协议、ICMP协议等直接访问,主要用于单机进程间socket通信
ping命令
TCP连接
服务器端
- 获取socket套接字:socket函数
- 绑定IP和端口:bind函数
- 开启监听,将服务器的主动连接变为被动连接:listen函数
- 阻塞等待服务器连接:accept函数
客户端
- 创建socket套接字:socket函数
- 绑定IP和端口(可以省略):bind函数
- 连接服务器:connect函数
UDP连接
服务器端
- 创建socket套接字:socket函数
- 绑定IP和端口:bind函数
- 阻塞等待接收数据:recvfrom函数
- 关闭socket套接字:close函数
客户端
- 创建socket套接字:socket函数
- 发送数据:sendto函数
- 关闭socket:close函数