分层结构
七层分层结构: 从下向上(第一层:物理层,第七层:应用层)
四层结构: 从下向上(第一层:链路层,第四层:应用层)
TCP协议简介
TCP是一种面向连接的,可靠的传输通信协议
主要功能: 提供不同主机上的进程间通信(端对端)
特点
1,建立链接->使用链接->释放连接(虚电路)
2,TCP数据包中包含序号和确认序号
3,对包进行排序并检错,而损坏的包可以被重传
服务对象
需要高度可靠性且面向连接的服务
如HTTP,FTP,SMTP,MQTT等
建立连接时的三次握手:
1, C->SYN 2, S->SYN+ACK 3, C->ACK
释放链接时的四次挥手:
1, C->FIN 2, S-ACK 3, S-FIN 4, C->ACK
UDP协议简介
UDP 是一种面向无连接的传输层通信协议.
功能: 提供不同主机上的进程间通信(端到端的)
特点:
1,发送数据之前不需要建立链接
2,不对数据包的顺序进行检查
3,没有错误检测和重传机制
服务对象
主要用于"查询--应答"的服务
如: NFS,NTP,DNS等
NTP: 网络时间协议 DNS: 域名系统
IP地址
IP地址是一种Internet 上的主机编址方式,也称为网际协议地址.
IP地址组成:
使用32bit,由{网络ID,主机ID}两部分组成
子网ID(网络ID): IP地址中由子网掩码中1覆盖的连续位
主机ID: IP地址中由子网掩码中0覆盖的连续位
字节序的转换函数
#include <arpa/inet.h>
发送者调用的函数
//将32位的主机字节序转换成网络字节序
uint32_t htonl(uint32_t hostlong); //转IP
//将16位主机字节转换成主机字节序
uint16_t htons(uint16_t hostshort); //转端口
接受者调用函数
//将32位的网络字节序转换成主机字节序
unint32_t ntohl(uint32_t netlong); //转IP
//将16位的网络字节序转换成主机字节序
uint16_t ntohs(uint16_t netshort); //转端口
IP地址转换函数
#include <arpa/inet.h>
inet_pton函数
功能: 字符串ip地址转整型数据,即将点分十进制数串转换成32位无符号整数
int inet_pton(int af, const char *src, void *dst);
参数:
af:转换的协议:
AF_INET(IPV4)
AF_INET6(IPV6)
src: 点分十进制数串的首元素地址
dst:4字节的IP地址
inet_ntop函数
功能:整型数据转字符串格式ip地址
const char *inet_ntop(int af, const void *src, char *dst, socklen_t size);
参数:
af: 转换的协议,如AF_INET(IPV4) AF_INET6(IPV6)
src: 4字节的IP地址的起始地址
dst: 存放点分十进制数串的起始地址
size: 点分十进制数串的最大长度
#define INET_ADDRSTRLEN 16 //for ipv4
#define INET_ADDRSTRLEN 46 //for ipv
返回值: 成功则返回字符串的首地址;失败则返回NULL
创建UDP套接字
创建一个用于网络通信的socket套接字(描述符)
int socket(int family, int type, int protocol)
参数:
family:协议族(AF_INET,AF_IVET6,PF_PACKET等)
type:套接字类(SOCK_STREAM,SOCK_DGRAM.SOCK_RAM,SOCK_RAW等),
UDP的为SOCK_DGRAM.
SOCK_STREAM为TCP的.
protocol:协议类别(0,IPPROTO_TCP,IPPRPTP_UDP等),一般采用0
返回值: 成功:套接字, 失败:-1.
特点:创建套接字时,系统不会分配端口.
[扩展]:使用完套接字后,可以通过close()函数关闭.
地址结构
#include <netinet/in.h>
IPV4地址结构struct sockaddr_in
[扩展] inet_addr("ipv4的地址")转化为in_addr_t的网络ip数值
发送数据-sendto函数
需要知道对方的ip和端口号
ssize_t sendto(int sockfd, const void *buf,size_t nbytes, int flags, const struct sockaddr *to,socklen_t addrlen);
功能:向to结构体指针中指定的ip,发送UDP数据报
参数:
sockfd: 套接字
buf: 发送数据缓冲区
nbytes: 发送数据缓冲区的大小
flags: 一般为0
to: 指向目的主机地址结构体的指针
addrlen: to所指向内容的长度
注意:
通过to 和addrlen 确定目的地址
udp可以发送0长度的UDP数据包
返回值: 成功:发送数据的字符数组; 失败:-1;