Linux网络编程必备的POSIX API的细节

这篇具有很好参考价值的文章主要介绍了Linux网络编程必备的POSIX API的细节。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

POSIX API大集合

五元组

三次握手的过程, 内核协议栈分析

listen函数

DDOS攻击, 洪水攻击

DDOS 攻击的应对措施

数据发送

 怎么保证顺序?如何保证包地顺序到达(序号 + 确认应答机制 + 重传)

TCP断开连接的过程

问题1. 大量的CLOSE_WAIT + FIN_WAIT2是为啥?

time_wait状态存在的原因?


POSIX API大集合

Linux网络编程必备的POSIX API的细节

五元组

(sip, sport, dip, dport, protocol)

三次握手的过程, 内核协议栈分析

内核协议栈中是有内核数据结构的.   

我们send/write数据, 都是先发送到内核协议栈中,然后由内核协议栈封装发送到物理介质中传输到对端的

对端的接收过程也是经有内核协议栈进行解包, 最终对端应用层获取数据. 

Linux网络编程必备的POSIX API的细节 三次握手的过程是由客户端的用户通过connect系统调用发起的

由内核协议栈之间完成三次握手. 建立连接的.

第一次握手的时候, 会根据五元组生成一个 node 挂载到半连接队列syn队列中. 

第三次握手的时候会根据五元组的信息定位半连接队列中对应的node结点将其移动到accept queue中去.   

accept函数则是根据accept中的一个结点为其分配一个fd并且return 

Linux网络编程必备的POSIX API的细节

connect调用之后客户端处于 syn-sent状态  + 服务端接收到第一次握手数据包的时候处于  syn-recv状态.

listen函数

 int listen(int sockfd, int backlog);

unix系统中,backlog 是syn队列+accept队列的最大值;

linux系统中,backlog是accept队列的最大值。

至此我非常向提到一个东西叫做

DDOS攻击, 洪水攻击

eg : 在syn上做文章.  不断的向服务器发出syn请求, 请求和服务器建立连接, 恶意的占满服务器的syn队列. 使得正常的普通客户无法和服务器正常建立联系, 无法获取服务.

这个就算最为初级的syn洪水了

还可以利用反射机制,达到借刀杀人的效果

就是将目标服务器ip填写为源ip地址和其他机器请求建立连接.

这样其他机器误以为是服务器想要建立连接, 就会不断的向服务器发送syn + ack包, 这样服务器也会疲于处理大量的无效syn + ack包而无法正常运作

甚至还有更为牛逼的放大攻击.

利用服务器的ip地址发送DNS请求, 然后对于DNS请求而言, 一般是发送一个请求报文远远小于响应报文的, 这样就可以达到放大的效果. 放大垃圾数据攻击服务器.

DDOS 攻击的应对措施

在服务器前面放一台巨大的堡垒机. 让其拦截掉恶意请求.过滤连接请求. 达到净化的效果

数据发送

其实针对数据的send/write是从用户态拷贝到内核协议栈的内核缓冲区中的,然后由内核协议栈不断地进行层层封包, 最后放到物理介质传输到对端, 对端接收到数据报, 在根据头部信息分用, 最终将数据传到应用层

Linux网络编程必备的POSIX API的细节

 怎么保证顺序?如何保证包地顺序到达(序号 + 确认应答机制 + 重传)

延迟ack,解决包的有序的问题. 就不见ack, 会在最近序号没有收到ack位置及其之后所有的包全部重传, 这样就可以保证一定是顺序到达地. 后面地包先到也没用,还是会丢弃重传. (保证顺序)

Linux网络编程必备的POSIX API的细节

重传费带宽, 所以有些时候需要考虑udp, 比如在弱网环境下, 也就是网络环境非常差劲地情况下.

实时性强的场景,也可以选择udp

udp使用场景:

  1. 游戏,利用UDP的实时性;
  2. 迅雷下载,使用UDP传输,抢占带宽;TCP有拥塞控制,对带宽进行控制。

TCP断开连接的过程

Linux网络编程必备的POSIX API的细节

 tcp连接的断开过程. 是由客户端发起的close。然后内核协议栈会向对端发送一个fin包, 同时主动发起方进入fin_wait1状态, 然后对端收到fin包,先回一个ack然后被动的进入close_wait状态. 为何此处的fin + ack不可以何在一起, 因为服务器端很可能还需要向客户端发送未发送完的数据. 发送完之后才会进行close.

问题1. 大量的CLOSE_WAIT + FIN_WAIT2是为啥?

服务端没有处理断开连接的逻辑, 收到客户端的fin包,关闭了读端之后没有进行close。(没有close的逻辑)

time_wait状态存在的原因?

避免最后一次ack的丢失, 如果服务器久收不到客户端发送过来的ack包,也就是被动方久收不到ack就会重新发送fin,这个时候不等,不就没了嘛。 为了让服务端正常断开这条连接, 于是等待time_wait = 2MSL。文章来源地址https://www.toymoban.com/news/detail-426407.html

到了这里,关于Linux网络编程必备的POSIX API的细节的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Java网络编程-API监测

    实现一个用于监测 API 接口可用性的线程类,其作用是通过发送 HTTP 请求到指定的 API 接口,并监测接口的可用性。 代码中的 APIThread 类继承自 Thread ,意味着它可以在单独的线程中执行。 在 run 方法中,使用 HttpURLConnection 建立与 API 接口的连接,并发送 HTTP 请求。通过设置连

    2024年02月08日
    浏览(39)
  • 【计算机网络】网络编程接口 Socket API 解读(5)

             Socket 是网络协议栈暴露给编程人员的 API,相比复杂的计算机网络协议,API 对关键操作和配置数据进行了抽象,简化了程序编程。         本文讲述的 socket 内容源自 Linux man。本文主要对各 API 进行详细介绍,从而更好的理解 socket 编程。 connect()         

    2024年02月08日
    浏览(47)
  • 【计算机网络】网络编程接口 Socket API 解读(2)

             Socket 是网络协议栈暴露给编程人员的 API,相比复杂的计算机网络协议,API 对关键操作和配置数据进行了抽象,简化了程序编程。         本文讲述的 socket 内容源自 Linux man。本文主要对各 API 进行详细介绍,从而更好的理解 socket 编程。 遵循 POSIX.1 - 2008    

    2024年02月09日
    浏览(43)
  • 【计算机网络】网络编程接口 Socket API 解读(11)

             Socket 是网络协议栈暴露给编程人员的 API,相比复杂的计算机网络协议,API 对关键操作和配置数据进行了抽象,简化了程序编程。         本文讲述的 socket 内容源自 Linux man。本文主要对各 API 进行详细介绍,从而更好的理解 socket 编程。 遵循 POSIX.1-2008      

    2024年02月08日
    浏览(46)
  • 【计算机网络】网络编程接口 Socket API 解读(1)

             Socket 是网络协议栈暴露给编程人员的 API,相比复杂的计算机网络协议,API 对关键操作和配置数据进行了抽象,简化了程序编程。         本文讲述的 socket 内容源自 Linux man。本文主要对各 API 进行详细介绍,从而更好的理解 socket 编程。 遵循 POSIX.1 - 2001、POS

    2024年02月09日
    浏览(44)
  • 【计算机网络】网络编程接口 Socket API 解读(3)

             Socket 是网络协议栈暴露给编程人员的 API,相比复杂的计算机网络协议,API 对关键操作和配置数据进行了抽象,简化了程序编程。         本文讲述的 socket 内容源自 Linux man。本文主要对各 API 进行详细介绍,从而更好的理解 socket 编程。 poll()           遵

    2024年02月09日
    浏览(49)
  • 【计算机网络】网络编程接口 Socket API 解读(8)

             Socket 是网络协议栈暴露给编程人员的 API,相比复杂的计算机网络协议,API 对关键操作和配置数据进行了抽象,简化了程序编程。         本文讲述的 socket 内容源自 Linux man。本文主要对各 API 进行详细介绍,从而更好的理解 socket 编程。        本文主要描述

    2024年02月08日
    浏览(45)
  • 【计算机网络】网络编程接口 Socket API 解读(6)

             Socket 是网络协议栈暴露给编程人员的 API,相比复杂的计算机网络协议,API 对关键操作和配置数据进行了抽象,简化了程序编程。         本文讲述的 socket 内容源自 Linux man。本文主要对各 API 进行详细介绍,从而更好的理解 socket 编程。 recv()           遵

    2024年02月07日
    浏览(43)
  • 【计算机网络】网络编程接口 Socket API 解读(10)

             Socket 是网络协议栈暴露给编程人员的 API,相比复杂的计算机网络协议,API 对关键操作和配置数据进行了抽象,简化了程序编程。         本文讲述的 socket 内容源自 Linux man。本文主要对各 API 进行详细介绍,从而更好的理解 socket 编程。         这个是 RFC 7

    2024年02月08日
    浏览(54)
  • 【计算机网络】网络编程接口 Socket API 解读(9)

             Socket 是网络协议栈暴露给编程人员的 API,相比复杂的计算机网络协议,API 对关键操作和配置数据进行了抽象,简化了程序编程。         本文讲述的 socket 内容源自 Linux man。本文主要对各 API 进行详细介绍,从而更好的理解 socket 编程。 续  【计算机网络】网

    2024年02月08日
    浏览(49)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包