2.2.1-网络原理-posix-api
2.2.1 网络原理-posix api
2.2.1 网络原理-posix api
1. posix api
1. 建立链接
1.socket();
1.插座 插 座
网络io, fd, tcp contol block
- 两个功能分配fd ,int
- 分配tcb ,alloc()
2. bind(fd);
- IP,port,五元组(还有个传输协议)
3. listen();
tcb-> status =TCP_STATUS_LISTEN
tcb->syn_queue 半连接
tcb->accept_queue 全连接
4. accept();
- 分配fd
- fd-> tcb
5. 三次握手
1. seqnum
第一次握手开始时是随机值,随机值,不确定,好处是避免抓包
2. acknum
这两个数字,保证不丢失不乱序不重复
3. 三次握手是双工的,双方确定自己发送的消息都有收到
4. 发生在那些函数
客户端: connect()
服务端: listen(fd,backlog(就是半连接队列长度,或者是syn+accept队列总长度,未分配fd的tcb数量,或者是accept队列长度)),内核协议中完成的
5. tcp链接的生命周期,从什么地方开始
TCP连接的生命周期从三次握手开始,经过数据传输阶段,最后以四次挥手结束。整个过程确保了连接的可靠性和数据的完整性
源ip,目的ip,包里面就有
6. 第三次握手数据包,如何从半连接队列查找匹配的问题
在第三次握手过程中,服务器通过ACK报文中的客户端信息和确认号,从半连接队列中查找匹配的连接。如果匹配成功,连接进入全连接队列,完成建立;如果匹配失败,连接会被丢弃
7. ddos攻击怎么防护
在网络入口处部署流量清洗设备或服务,分析流量特征,过滤掉恶意流量,只将合法流量转发到目标服务器。
限制请求速率:对单个IP地址或IP段的请求速率进行限制,防止流量过载。
例如,限制每秒的请求数(QPS)或连接数
8. 如果是ET(边沿触发),如何处理所有的链接
while (1) {
// 接受所有可用的连接
while (1) {
int fd = accept(listen_fd, NULL, NULL);
if (fd == -1) {
if (errno == EAGAIN || errno == EWOULDBLOCK) {
// 没有更多连接可以接受
break;
} else {
// 发生错误
perror("accept");
exit(EXIT_FAILURE);
}
}
// 设置新连接的套接字为非阻塞模式
int flags = fcntl(fd, F_GETFL, 0);
fcntl(fd, F_SETFL, flags | O_NONBLOCK);
// 处理新连接(例如添加到epoll监听)
struct epoll_event ev;
ev.events = EPOLLIN | EPOLLET; // 边沿触发模式
ev.data.fd = fd;
if (epoll_ctl(epoll_fd, EPOLL_CTL_ADD, fd, &ev) == -1) {
perror("epoll_ctl");
close(fd);
}
}
// 处理其他事件(例如读取数据)
// ...
}
9. 补充
p2p时候会有这种情况,tcp的p2p(peer to peer,点对点) ,去中心化
fd=socket();
bind(8000);
connet
没有客户端服务端概念
2. 传输数据
1. send()只能把数据copy到内核
2. recv()只能把内核数据copy到app
3. mtuz(最大传输单元)
4. 滑动窗口和拥塞控制、慢启动(指数型增长然后线性增加,如果太多,直接截一半)
都是两个内核通信优化的东西
滑动窗口(Sliding Window)
(1)作用
滑动窗口用于流量控制,确保发送方不会发送过多数据,导致接收方缓冲区溢出。
接收方通过通告窗口大小(rwnd)告知发送方当前可接收的数据量。
(2)实现
发送方维护一个发送窗口,窗口内的数据可以发送,窗口外的数据需要等待确认。
接收方确认收到的数据后,发送方滑动窗口,继续发送后续数据。
(3)优点
允许发送方连续发送多个数据包,而不需要等待每个数据包的确认,提高了传输效率。
拥塞控制(Congestion Control)
(1)作用
拥塞控制用于避免网络过载,确保网络中的流量不会超过其承载能力。
通过动态调整发送方的发送速率,避免网络拥塞。
(2)实现
发送方维护一个拥塞窗口(cwnd),表示当前可以发送的数据量。
拥塞窗口的大小根据网络状况动态调整。
(3)核心机制
慢启动(Slow Start)
拥塞避免(Congestion Avoidance)
快速重传(Fast Retransmit)
快速恢复(Fast Recovery)
慢启动(Slow Start)
(1)作用
慢启动用于在连接建立初期或检测到网络拥塞后,逐步探测网络的可用带宽。
(2)实现
发送方从较小的拥塞窗口(cwnd)开始,每收到一个ACK,cwnd增加1个MSS(最大段大小)。
这种指数型增长方式可以快速探测网络的可用带宽。
(3)触发条件
连接刚建立时。
检测到网络拥塞(如超时重传)。
(4)结束条件
当cwnd达到慢启动阈值(ssthresh)时,进入拥塞避免阶段。
当检测到网络拥塞时,ssthresh被设置为当前cwnd的一半,cwnd重置为1,重新进入慢启动。
5. 延时确认
(1)作用
延时确认的目的是减少网络中ACK(确认)报文的数量,从而降低网络负载。
通过延迟发送ACK,可以等待是否有数据需要捎带(Piggybacking),或者是否有多个数据包可以合并确认。
(2)实现
当接收方收到一个数据包时,不会立即发送ACK,而是等待一段时间(通常为200ms)。
如果在这段时间内接收方有数据需要发送,可以将ACK捎带在数据包中一起发送。
如果在等待时间内没有数据需要发送,接收方会单独发送ACK。
(3)优点
减少ACK报文的数量,降低网络负载。
通过捎带ACK,提高网络利用率。
(4)缺点
可能会略微增加数据传输的延迟,因为发送方需要等待ACK才能继续发送数据。
(5)触发条件
默认情况下,TCP协议启用延时确认。
可以通过设置套接字选项TCP_QUICKACK来禁用延时确认。
6. 超时重传
(1)作用
快速重传的目的是在检测到数据包丢失时,立即重传丢失的数据包,而不需要等待超时重传。
通过快速重传,可以减少数据传输的延迟,提高传输效率。
(2)实现
当发送方连续收到3个重复的ACK时,认为数据包丢失,立即重传丢失的数据包。
重复的ACK表示接收方期望收到的数据包没有到达,但后续的数据包已经到达。
(3)优点
避免等待超时重传,减少数据传输的延迟。
提高传输效率,特别是在高延迟或高丢包率的网络中。
(4)触发条件
发送方收到3个重复的ACK(dupACK)。
重复的ACK表示接收方期望收到的数据包没有到达。
3. 断开链接(四次挥手)
1. 不分客户端服务器,只分主动方和被动方
2. close()是文件的函数,不是网络的函数
fd-> 回收
fin->
ret=recv();
if(ret==0){
close();
}
3. ack没有收到,先收到fin
也是发ack
4. 双方同时调用close()
当**双方同时调用close()**时,关闭过程是对称的,双方都既是主动关闭方又是被动关闭方。具体过程如下:
(1)双方发送FIN报文
双方几乎同时调用close(),分别发送FIN报文给对方。
此时,双方都进入FIN_WAIT_1状态。
(2)双方收到FIN并发送ACK
双方几乎同时收到对方的FIN报文。
双方分别发送ACK报文确认对方的FIN。
此时,双方都进入CLOSING状态。
(3)双方收到ACK并进入TIME_WAIT状态
双方几乎同时收到对方的ACK报文。
双方都进入TIME_WAIT状态,等待2MSL(最大段生存时间)以确保对方收到ACK。
(4)连接完全关闭
2MSL超时后,双方都进入CLOSED状态,连接完全关闭。
CLOSING状态是同时关闭时特有的状态,表示双方都发送了FIN并收到了对方的FIN,但还未收到对方的ACK。