目录

2.2.1-网络原理-posix-api

2.2.1 网络原理-posix api

2.2.1 网络原理-posix api

1. posix api

https://i-blog.csdnimg.cn/direct/319ffcd124e44d6db78ddc159f319c63.png#pic_center

1. 建立链接

1.socket();

1.插座 插 座

网络io, fd, tcp contol block

  1. 两个功能分配fd ,int
  2. 分配tcb ,alloc()
2. bind(fd);
  1. IP,port,五元组(还有个传输协议)
3. listen();
  1. tcb-> status =TCP_STATUS_LISTEN

  2. tcb->syn_queue 半连接

    tcb->accept_queue 全连接

4. accept();
  1. 分配fd
  2. fd-> tcb
5. 三次握手

https://i-blog.csdnimg.cn/direct/1fa1fbbc096b4d289e6d4f802f1bc2bd.png#pic_center

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. 补充

https://i-blog.csdnimg.cn/direct/1b5133347ca54a80acb610969216e131.png#pic_center

https://i-blog.csdnimg.cn/direct/e7e7020081dc4dd58970cc5c1522385e.png#pic_center

p2p时候会有这种情况,tcp的p2p(peer to peer,点对点) ,去中心化

fd=socket();
bind(8000);
connet

没有客户端服务端概念

2. 传输数据

https://i-blog.csdnimg.cn/direct/18066f9a41454b40bf344946bbfcdd84.png#pic_center

1. send()只能把数据copy到内核
2. recv()只能把内核数据copy到app
3. mtuz(最大传输单元)
4. 滑动窗口和拥塞控制、慢启动(指数型增长然后线性增加,如果太多,直接截一半)

都是两个内核通信优化的东西

  1. ​滑动窗口(Sliding Window)​

    (1)​作用

    滑动窗口用于流量控制,确保发送方不会发送过多数据,导致接收方缓冲区溢出。

    接收方通过通告窗口大小(rwnd)告知发送方当前可接收的数据量。

    (2)​实现

    发送方维护一个发送窗口,窗口内的数据可以发送,窗口外的数据需要等待确认。

    接收方确认收到的数据后,发送方滑动窗口,继续发送后续数据。

    (3)​优点

    允许发送方连续发送多个数据包,而不需要等待每个数据包的确认,提高了传输效率。

  2. ​拥塞控制(Congestion Control)​

    (1)​作用

    拥塞控制用于避免网络过载,确保网络中的流量不会超过其承载能力。

    通过动态调整发送方的发送速率,避免网络拥塞。

    (2)​实现

    发送方维护一个拥塞窗口(cwnd),表示当前可以发送的数据量。

    拥塞窗口的大小根据网络状况动态调整。

    (3)​核心机制

    ​慢启动(Slow Start)​

    ​拥塞避免(Congestion Avoidance)​

    ​快速重传(Fast Retransmit)​

    ​快速恢复(Fast Recovery)​

  3. ​慢启动(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. 断开链接(四次挥手)

https://i-blog.csdnimg.cn/direct/a7919ee345594edd9be1f6d470b830a6.png#pic_center

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。