网络编程入门

1.协议

1.1 网络的概念
在计算机网络中协议是个很重要的概念,是数据传输和数据解释的规则

1.2 典型的协议有TCP/UDP、HTTP、FTP、IP、ARP。


2.分层模型

2.1 OSI 7层模型:物数网传会表应
物 - 物理层
数 - 数据链路层
网 - 网络层
传 - 传输层
会 - 会话层
表 - 表示层
应 - 应用层

2.2TCP/IP 4层模型:网络接口层,网络层,传输层,应用层
每层对应的协议:
数据链路层 — 以太网帧协议
网络层 — IP
传输层 — TCP/UDP
应用层 — FTP, HTTP, SSH…

协议的种类有很多,以上提到的协议是运用比较广泛的协议


3.tcp,udp传输层协议

3.1 tcp:面向连接的安全可靠的流式传输协议
tcp这里所说的安全可靠是指数据在传输时的完整,不会在传输时丢失。
tcp之所以安全可靠是因为在连接的时候要进行三次握手,发送数据的时候会进行数据确认,断开连接时会进行四次握手。正常情况下,数据在丢失后,会进行数据重传。

3.2 udp:面向无连接的不安全的报式传输

  • 连接的时候不会握手
  • 数据发送出去之后就不管了
  • 如果数据包丢失就全丢,不存在丢失一半的情况

4.三次握手,四次挥手

在这里插入图片描述
标志位:

  • SYN:请求建立连接
  • ACK:应答
  • FIN:断开连接

三次握手过程(建立连接)
第一次握手
客户端携带标志位SYN,并随机产生一个32位序号,后面可以携带数据,可以为0
服务器端检测SYN的值是否为1,如果为1第一次握手成功
第二次握手
服务器端携带ACK标志位和确认序号(随机序号+1),同时发起连接请求,携带SYN和32位随机序号
客户端检测SYN标志位是否为1,并检测确认序号是否正确,正确的话第二次握手成功
第三次握手
客户端发送数据包携带ACK和确认序号(服务器的随机序号+1)
服务器端检测ACK端是否为1,并校验确认序号是否正确,正确的话第三次握手成功

四次挥手过程(断开连接)

断开连接哪一方都可以是主动断开
需要的标志位:FIN(编号为最后发送ACK的时候携带的确认序号)
下面假设是客户端主动断开连接

第一次挥手
客户端发送断开连接的请求,携带FIN和编号,还有ACK和序号
服务器端检测FIN的值是否为1,ACK的作用告诉对方之前发的数据收到多少
第二次挥手
服务器发送确认数据包,ACK和确认序号(FIN对应的序号+1)和数据大小
客户端检测ACK的值,并检测确认序号
第三次挥手
服务器发送断开连接的请求,携带FIN+序号和ACK+序号
客户端进行数据监测,检测FIN,并校验确认序号
第四次挥手
客户端发送ACK,服务器端进行数据监测
在这里插入图片描述


5.IO多路转接

什么事I/O多路转接技术:

  • 先构建一张有关文件描述符的列表,将要监听的文件描述符添加到该表中
  • 然后调用一个函数,监听该表中的文件描述符,知道这些描述符表中的一个进行I/O操作时,该函数才返回
    • 该函数为阻塞函数
    • 函数对文件描述符的检测操作是由内核完成的
  • 在返回时,它告诉进程有多少哪些)描述符要进行I/O操作
epoll函数简述:

三个函数:

  • 生成一个epoll专用的文件描述符,生成一个树的根节点
int epoll_create(int size);

size:epoll上能关注的最大描述符数

  • 用于控制某个epoll文件描述符时间,可以注册、修改、删除
int epoll_ctl(int epfd, int op, int fd, struct epoll_event *event);

typedef union epoll_data {
		void        *ptr;
		int          fd;
		uint32_t     u32;
		uint64_t     u64;
} epoll_data_t;
           
struct epoll_event {
		uint32_t     events;      /* Epoll events */
		epoll_data_t data;        /* User data variable */
};

events:
 - EPOLLIN -- EPOLLOUT -- EPOLLERR - 异常

参数:

  • epfd:epoll_create生成的epoll专用描述符
  • op:
    • EPOLL_CTL_ADD – 注册
    • EPOLL_CTL_MOD – 修改
    • EPOLL_CTL_DEL – 删除
  • fd:关联的文件描述符
  • event:告诉内核要监听什么事件

  • 等待IO事件发生 - 可以设置阻塞的函数
int epoll_wait(
		int epfd, 
		struct epoll_event *events,   //数组
		int maxevents, 
		int timeout
);

参数:

  • epfd:要检测的句柄
  • events:用于回传待处理事件的数组
  • maxevents:告诉内核这个events的大小
  • timeout:为超时时间
    • -1:永久超时
    • 0:立即返回
    • 大于0:阻塞时间
  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值