1.网络概述
1.提供了强大完善的网络功能
1.完善的内置网络,和内核紧密的结合在一起
2.Linux提供大量免费internet软件
3.通过Linux命令完成内部或文件的传输
4.远程访问
5.安全可靠
2.LINUX网络模型
三层协议:网络层
Linux网络层主要包含协议:第一部分网络层协议:IP,ICMP,ARP
第二部分传输层协议:TCP,UDP(不连接 非可靠)
LINUX应用层协议:telnet,ftp/tftp,smtp(简单文件传送协议),dns
协议封装:
二层协议封装三层协议,三层协议封装应用层协议
应用程序->TCP->IP->以太网驱动程序->以太网进行传输
wireshark 工具
1.socket
是一种文件描述符
三种类型:
1.流式套接字(sock_stream)使用TCP协议,然后使用IP
2.数据报套接字(sock_dgram)使用UDP然后使用IP
3.原始套接字(sock_raw)直接基于IP协议。允许使用IP协议,主要用于新的网络协议的测试
2.网络地址
用struct sockaddr来记录网络地址
struct sockaddr
{
u_short sa_family;//协议族,采用AF_xxx的形式,AF_INET(IP协议族)
char sa_data[14];//14字节的特定协议地址
3.地址结构
实际应用中不用上面的二用struct sockaddr_in
struct sockaddr_in
{
short int sin_family;//协议族
unsigned short int sin_port; //端口号
struct in_addr sin_addr;//协议特定地址
unsigned char sin_zero[8];//填0
}//会用一个32位的整数来表示一个IP地址
4.地址转换
inet_aton将IP转换为32为整数
inet_ntoa将32位整数转换为IP
5.字节序转换
网络采用(big endian)字节序不统一时,要进行转换
不转化会产生解释错误的问题
htons: unsigned short 从主机序转换为网络序(host to net short)
htonl: unsigned long 从主机序转换为网络序(host to net long)
ntohs:(net to host short)
ntohl:(net to host long)
6.IP与主机名
标识一台主机可以用IP也可以用主机名
struct hostent *gethostbyname(const char* hostname)
struct hostent这里面包含IP地址
7.socket编程函数
socket:创建一个socket
bind:用于绑定IP地址和端口号到socket
connect:该函数用于与服务器建立连接
listen:设置服务器能处理的最大连接要求
accept:用来等待来自客户端的socket连接请求
send:发送数据
recv:接受数据
3.TCP(编程模型与函数是最重要的)
1.基于TCP-服务器
1.创建一个socket用函数socket()
2.绑定IP地址、端口等信息到socket上,用函数bind()
3.设置允许的最大连接数,用函数listen()
4.等待来自客户端的连接请求,用函数accept()。没有连接时会阻塞在此处
5.收发数据,用函数send()和recv()或者read()和write()
6.关闭网络连接
2.基于TCP-客户端
1.创建一个socket,用函数socket()
2.设置要连接的服务器的IP地址和端口等属性
3.连接服务器,用函数connect()
4.收发数据,用函数send()和recv(),或者read()和write()
5.关闭网络
1.基于UDP-服务器
1.创建一个socket用函数socket()
2.绑定IP地址、端口等信息到socket上,用函数bind()
3.循环接受数据,用函数recvfrom();没有数据再此处发生阻塞
4.关闭网络连接
2.基于UDP-客户端
1.创建一个socket,用函数socket()
2.绑定IP地址、端口等信息到socket上,用函数bind()。可选的,此步骤可以没有
3.设置对方的IP地址和端口等属性
4.发送数据,用函数sendto()。参数中含有上面设置的数据内容
5.关闭网络连接
在网络程序里面,一般来说都是许多客户对应一个服务器,为了处理客户的请求,对服务端的程序就提出了特殊的要求。
目前最常用的服务器模型有:
1.循环服务器:服务器在同一个时刻只能响应一个客户端的请求
2.并发服务器:服务器在同一个时刻可以相应多个客户端的请求
1.UDP循环服务器
UDP每次从套接字上读取一个客户端的请求->处理->然后将结果返回给客户机。
socket(···);
bind(···);
while(1)
{
recvfrom()
process()//处理
sendto()
}
收发处理都在一个进程或线程中进行处理
2.TCP循环服务器
TCP循环服务器接受一个客户端的连接,然后处理,完成了这个客户的所有请求后,断开连接
socket()
bind()
listen()
while(1)
{
accept()
process()//处理
close()
}
一次只能处理一个客户端的请求。只有在这个客户端的所有请求都满足后,服务器才可以继续后面的请求。
这样如果有一个客户端占住服务器不放时,其他的客户机都不能工作了,因此,TCP服务器一般很少使用循环服务器模型
一个客户端结束后,另一个客户端才能够连接上。
(测试UDP,UDP不会这样,因为UDP不会建立连接)
3.TCP并发服务器(思想是创建子进程进行处理)
并发服务器的思想是每一个客户机的请求并不是由服务器直接处理,而是由服务器创建一个子进程来处理
socket
bind
listen
while(1){
accept()
if(fork()==0)
{
process()
close()
exit()
}
close()
}
1.提供了强大完善的网络功能
1.完善的内置网络,和内核紧密的结合在一起
2.Linux提供大量免费internet软件
3.通过Linux命令完成内部或文件的传输
4.远程访问
5.安全可靠
2.LINUX网络模型
见图
三层协议:网络层
Linux网络层主要包含协议:第一部分网络层协议:IP,ICMP,ARP
第二部分传输层协议:TCP,UDP(不连接 非可靠)
LINUX应用层协议:telnet,ftp/tftp,smtp(简单文件传送协议),dns
协议封装:
二层协议封装三层协议,三层协议封装应用层协议
应用程序->TCP->IP->以太网驱动程序->以太网进行传输
wireshark 工具
具体协议包功能
1.socket
是一种文件描述符
三种类型:
1.流式套接字(sock_stream)使用TCP协议,然后使用IP
2.数据报套接字(sock_dgram)使用UDP然后使用IP
3.原始套接字(sock_raw)直接基于IP协议。允许使用IP协议,主要用于新的网络协议的测试
2.网络地址
用struct sockaddr来记录网络地址
struct sockaddr
{
u_short sa_family;//协议族,采用AF_xxx的形式,AF_INET(IP协议族)
char sa_data[14];//14字节的特定协议地址
3.地址结构
实际应用中不用上面的二用struct sockaddr_in
struct sockaddr_in
{
short int sin_family;//协议族
unsigned short int sin_port; //端口号
struct in_addr sin_addr;//协议特定地址
unsigned char sin_zero[8];//填0
}//会用一个32位的整数来表示一个IP地址
4.地址转换
inet_aton将IP转换为32为整数
inet_ntoa将32位整数转换为IP
5.字节序转换
网络采用(big endian)字节序不统一时,要进行转换
不转化会产生解释错误的问题
htons: unsigned short 从主机序转换为网络序(host to net short)
htonl: unsigned long 从主机序转换为网络序(host to net long)
ntohs:(net to host short)
ntohl:(net to host long)
6.IP与主机名
标识一台主机可以用IP也可以用主机名
struct hostent *gethostbyname(const char* hostname)
struct hostent这里面包含IP地址
7.socket编程函数
socket:创建一个socket
bind:用于绑定IP地址和端口号到socket
connect:该函数用于与服务器建立连接
listen:设置服务器能处理的最大连接要求
accept:用来等待来自客户端的socket连接请求
send:发送数据
recv:接受数据
3.TCP(编程模型与函数是最重要的)
1.基于TCP-服务器
1.创建一个socket用函数socket()
2.绑定IP地址、端口等信息到socket上,用函数bind()
3.设置允许的最大连接数,用函数listen()
4.等待来自客户端的连接请求,用函数accept()。没有连接时会阻塞在此处
5.收发数据,用函数send()和recv()或者read()和write()
6.关闭网络连接
2.基于TCP-客户端
1.创建一个socket,用函数socket()
2.设置要连接的服务器的IP地址和端口等属性
3.连接服务器,用函数connect()
4.收发数据,用函数send()和recv(),或者read()和write()
5.关闭网络
3.TCP通讯模型
1.基于UDP-服务器
1.创建一个socket用函数socket()
2.绑定IP地址、端口等信息到socket上,用函数bind()
3.循环接受数据,用函数recvfrom();没有数据再此处发生阻塞
4.关闭网络连接
2.基于UDP-客户端
1.创建一个socket,用函数socket()
2.绑定IP地址、端口等信息到socket上,用函数bind()。可选的,此步骤可以没有
3.设置对方的IP地址和端口等属性
4.发送数据,用函数sendto()。参数中含有上面设置的数据内容
5.关闭网络连接
3.UDP通信模型
在网络程序里面,一般来说都是许多客户对应一个服务器,为了处理客户的请求,对服务端的程序就提出了特殊的要求。
目前最常用的服务器模型有:
1.循环服务器:服务器在同一个时刻只能响应一个客户端的请求
2.并发服务器:服务器在同一个时刻可以相应多个客户端的请求
1.UDP循环服务器
UDP每次从套接字上读取一个客户端的请求->处理->然后将结果返回给客户机。
socket(···);
bind(···);
while(1)
{
recvfrom()
process()//处理
sendto()
}
收发处理都在一个进程或线程中进行处理
2.TCP循环服务器
TCP循环服务器接受一个客户端的连接,然后处理,完成了这个客户的所有请求后,断开连接
socket()
bind()
listen()
while(1)
{
accept()
process()//处理
close()
}
一次只能处理一个客户端的请求。只有在这个客户端的所有请求都满足后,服务器才可以继续后面的请求。
这样如果有一个客户端占住服务器不放时,其他的客户机都不能工作了,因此,TCP服务器一般很少使用循环服务器模型
一个客户端结束后,另一个客户端才能够连接上。
(测试UDP,UDP不会这样,因为UDP不会建立连接)
3.TCP并发服务器(思想是创建子进程进行处理)
并发服务器的思想是每一个客户机的请求并不是由服务器直接处理,而是由服务器创建一个子进程来处理
socket
bind
listen
while(1){
accept()
if(fork()==0)
{
process()
close()
exit()
}
close()
}