posix_api(可移植接口)---网络编程函数详解
客户端的函数
1.socket()
2.bind()---optional
3.connect()---udp
4.send()
5.recv()
6.close()
服务器端的函数
1.socket()
2.bind()
3.listen()
4.accept()
5.recv()
6.send()
7.close()
EPOLL
epoll_creat()
epoll_ctl()
epoll_wait()
具体过程来讲
建立连接
1.socket
<fd---tcp control block>
a.创建一个bitmap,做fd的回收和使用,bitmap的位数对应使用的fd
b.分配tcb
2.bind
a.传一个fd,绑定 ip port(随机的话1024-65535) 到tcb----设置的过程,修改tcb里面的值
3.listen(tcp状态迁移图,与tcp三次握手四次挥手有关)
a.修改tcb里面的状态 tcb->status = TCP_STATUS_LISTEN
b.创建两个队列 syn_queue 半连接队列 accept_queue 全连接队列
c.第一次握手,fd对应的tcb放到syn_queue;三次握手完成 tcb **move** 到 accept_queue
//syn泛红,DDos攻击,客户端一直发连接,不处理第二次判断,syn_queue放慢了
//解决办法------listen的第二个参数
//(1)设置syn-queue的长度(最初的想法,后来被防火墙的取代) (2).syn_queue+accept_queue的长度 (3).accept_queue的长度(提升建立tcp连接的吞吐量)
4.connect (要与listen联系起来)
a.客户端发起connect,内核协议栈开始三次握手判断
5.accept
a.分配fd
b.映射fd->tcb
c.EOPLLIN同时来 ET(边沿触发)--->循环阻塞直到全部处理完while
传输数据
程序只处理应用数据copy到内核的缓冲区,内核的传输是由协议栈处理的(MTU),与我们写的程序无关(即send与数据的传输是分离异步的)
tcp描述的是内核到内核,我们写的程序是处理应用数据到内核
慢启动和拥塞控制
慢启动---前面指数级的发送数据
拥塞控制--发的数据太多了可能会阻塞,此时循环线性递增一段发送
滑动窗口
接收数据的组合保证有序不重复(利用tcp seqnum和acknum序列号,一序列排序传输到应用程序)
1.send
2.recv
断开连接
只有主动方和被动发,四次挥手
1.close
a.只是文件系统的函数
b.回收fd
c.send 应用层:一个数据长度为0的数据,对方知道请求close 内核层:tcp头部的fin标志位
特别的
peer-to-peer p2p的连接
去中心化的连接保证安全,即去掉网关
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 上周热点回顾(2.24-3.2)