IP地址:唯一定位网络上的一台主机
无符号四个字节的整数 ---uint32_t
端口:标识一台主机上网络通信的进程
无符号两个字节的数据 ---uint16_t 0-65535
进程的标识为什么不用pid? 进程的PID会随着进程的创建而改变
sip + sport + dip + sport + proto 一条信息的五元组(用于标识网络上的一条通信)
数据起点 数据终点 协议
网络字节序:大小端
大端字节序:低地址存高位
小端字节序:低地址存地位
不同字节序主机之间进行数据传输,将造成数据的逆序,也就说得不到人家真正发送数据,怎么办?
在网络间进行通信的时候必须使用大端字节序---网络字节序
也就意味着我们的主机是小端字节序,那么通信的时候就需要对数据逆序,但是并不是所有数据都逆序,主要针对在内存中存储时,
占据字节大于一个字节的数据
int short long float double 针对这些类型的数据,因为在内存中的存储更展示的刚好顺序相反,而发送时候,按字节发送,对方按字节接收,
那么对方如果是大端,因为低地址存高位,因为存储顺序和使用顺序完全相同,导致数据跟实际想发送的数据顺序刚好相反,因此需要进行字节逆序转换。
主机字节序:就是当前主机的字节序---大小端不一定,取决于cpu的架构
网络层套接字编程:socket是一套操作系统提供的接口——供用户进行网络通信编程。
主要说的是传输层tcp/udp
因为传输层有两个典型协议分别是tcp和udp,我们必须选择其一进行数据传输,选哪个尼?
这时候我们必须明了两个协议的有缺点,视使用场景而定。
tcp:面向连接,可靠传输,字节流服务
面向连接,可靠传输:数据的可靠传输;字节流传输;数据传输灵活
优点:可靠传输,并且传输灵活;缺点;传输速度较低,数据粘包
udp:无连接,不可靠,面向数据报
优点:传输速度快,无粘包;
缺点:不可靠
针对数据安全性要求高的场景(文件传输)使用tcp保证数据的可靠
针对数据安全性要求不是很高,但是实时性要求高的场景(视频传输)用udp保证速度
socket套接字编程:
网络编程涉及到对网卡的操作,因此操作系统提供了一套接口来供我们操作--socket接口
网络编程中分了两个端:客户端程序/服务端程序
在网络编程中,客户端就是主动的一方,客户端必须知道服务端的地址信息(ip+port),并且服务端还必须得在这个指定的地址上等着别人。
udp编程步骤:
服务端:
创建套接字
建立网卡与进程间的关系
为套接字绑定地址信息
圈定要操作的网卡上的那些数据
为套接字绑定地址端口,就是为了声明去网卡接收数据的时候,接收的是那一部分数据(因为网卡上会有很多的数据)。
发送或接收数据
关闭套接字
客户端:
创建套接字
绑定(不主动绑定)
发送/接收数据
关闭套接字
socket() bind() sendto()/rse () close()
客户端建议不要手动绑定地址信息,因为绑定了有可能绑定失败,因此,最好把绑定的过程交给操作系统完成,因为操作系统会选择一个
当前合适的地址信息进行绑定,这样做可以将失败的可能性降至最低
服务端必须绑定地址,因为服务端是被动的一端,必须告诉别人需要将数据发送到哪个地址哪个端口,因此自己就必须接收这个地址这个端口的数据
tcp编程步骤:
服务端:创建套接字->绑定套接字->开始监听(建立一个新的socket,单独与新客户进行通信)->获取这个新创建的socket->收发数据->关闭套接字
客户端:创建套接字->向服务器端发起连接请求->收发数据->关闭套接字
listen的第二参数:一个整形数字
用于定义一个挂起的连接队列最大节点数,表示同一时间的并发连接数(同一时间能够接受多少个客户端连接)
int listen(int socket , int backlog);
socket :套接字描述符
backlog: 定义已完成连接队列的最大节点数,每一个新客户端都会创建新的socket,一个新连接建立连接有一个过程,如果这个新的连接已经
完成三次握手过程,如果这个新的socket放到这个队列中,这个backlog决定了同一时间的最大并发连接数
accept的理解:
每一个客户端向服务器端发起连接请求,在服务器端都会新建一个socket结构,当这个新的连接走完三次握手过程,完成建立连接,这个新的
socket结构会放到已完成队列中。
accept获取新连接的客户端,实际上是从已完成队列获取一个已完成连接的socket,并且返回这个新的socket的套接字描述符。
int accept(int socket,struct sockaddr *addr , socklen_t *addrlen);
addr:新连接客户端地址信息
addrlen:用于确定要获取地址信息的长度,接收实际长度
返回值:新建的socket连接的套接字描述符,失败 -1
多进程版本:缺点:1.当连接发送请求是才创建,耗费时间
2.连接非常多时系统会存在很多进程,CPU调度成本增加
3.占用资源非常多,导致客服务客户数降低
优点:可靠性较强
多线程版本:缺点:没有多进程可靠性高
优点:相对于多进程版本会延缓CPU创建进程较小
netstat -apnt 抓取TCP数据包
telnet 连接服务器
ps -aL | head -1 && ps -aL | grep tcp_serv