1.自连接是什么

在发起连接时,TCP/IP的协议栈会先选择source IP和source port,在没有显示调用bind()的情况下,source IP由路由表确定,source port由TCP/IP协议栈从local port range中选取尚未使用的port。

如果destination IP正好是本机,而destination port位于local port range,且没有服务器监听(listen)的话,source port可能正好选中了destination port这就出现了(source IP,source port)=(destination IP,destination port)的情况,即发生了自连接。

2.自连接是怎么发生的

1. 两个tcp连接同时打开

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-1ax6Cx2X-1620216330809)(https://p6-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/43753ba6ae7f4b3eb984a2d0ff204720~tplv-k3u1fbpfcp-watermark.image)]

2.本来正常运行的客户端和服务端,服务端偶然挂掉之后,客户端再去连接它,就有可能出现自连接现象。

例如:同一台机器上的客户端和服务端(端口:50000)建立了一个长连接,服务端的进程挂掉了,端口50000释放,客户端去connect这个服务端的目的端口的时候正好选择了50000作为源端口,此时该端口没人用(因为服务端挂断了),使用是合法的,于是自连接形成了。

3.如何防止自连接

1. 让服务监听的端口与客户端随机分配的端口不可能相同即可

因为客户端随机分配的范围由 /proc/sys/net/ipv4/ip_local_port_range 文件决定,,所以只要让服务监听的端口小于 客户端分配的端口范围,就不会出现客户端与服务端口相同的情况。

2. 出现自连接的时候,主动关掉连接

例如在Go语言的tcp库中,加入的自连接判断

func selfConnect(fd *netFD, err error) bool {// If the connect failed, we clearly didn't connect to ourselves.if err != nil {return false}// The socket constructor can return an fd with raddr nil under certain// unknown conditions. The errors in the calls there to Getpeername// are discarded, but we can't catch the problem there because those// calls are sometimes legally erroneous with a "socket not connected".// Since this code (selfConnect) is already trying to work around// a problem, we make sure if this happens we recognize trouble and// ask the DialTCP routine to try again.// TODO: try to understand what's really going on.if fd.laddr == nil || fd.raddr == nil {return true}l := fd.laddr.(*TCPAddr)r := fd.raddr.(*TCPAddr)return l.Port == r.Port && l.IP.Equal(r.IP)
}

重学TCP协议(5) 自连接相关推荐

  1. 重学TCP协议(12)SO_REUSEADDR、SO_REUSEPORT、SO_LINGER

    1. SO_REUSEADDR 假如服务端出现故障,主动断开连接以后,需要等 2 个 MSL 以后才最终释放这个连接,而服务重启以后要绑定同一个端口,默认情况下,操作系统的实现都会阻止新的监听套接字绑 ...

  2. 重学TCP协议(11)TFO(Tcp Fast Open)

    1. TFO 为了改善web应用相应时延,google发布了通过修改TCP协议利用三次握手时进行数据交换的TFO(TCP fast open,RFC 7413). TFO允许在TCP握手期间发送和接收 ...

  3. 重学TCP协议(4) 三次握手

    1. 三次握手 请求端(通常称为客户)发送一个 S Y N段指明客户打算连接的服务器的端口,以及初始序号.这个S Y N段为报文段1. 服务器发回包含服务器的初始序号的 S Y N报文段(报文段2)作 ...

  4. 重学TCP协议(3) 端口号及MTU、MSS

    1. 端口相关的命令 1.1 查看端口是否打开 使用 nc 和 telnet 这两个命令可以非常方便的查看到对方端口是否打开或者网络是否可达.如果对端端口没有打开,使用 telnet 和 nc 命令会 ...

  5. 重学TCP协议(10)SYN flood 攻击

    1.SYN flood 攻击 SYN Flood(半开放攻击)是一种拒绝服务(DDoS)攻击,其目的是通过消耗所有可用的服务器资源使服务器不可用于合法流量.通过重复发送初始连接请求(SYN)数据包,攻 ...

  6. 重学TCP协议(7) Timestamps 选项

    1.Timestamps 选项的组成部分 时间戳选项占10个字节= kind(1字节) + length(1字节) + info (8字节),其中kind=8,length=10,info由times ...

  7. 重学TCP协议(6) 四次挥手

    1. 四次挥手 客户端进程发出连接释放报文,并且停止发送数据.释放数据报文首部,FIN=1,其序列号为seq=u(等于前面已经传送过来的数据的最后一个字节的序号加1),此时,客户端进入FIN-WAIT ...

  8. 重学TCP协议(8) TCP的11种状态

    TCP的11种状态 为了逻辑更加清晰,假设主动打开连接和关闭连接皆为客户端,被动打开连接和关闭连接皆为服务端 客户端独有的:(1)SYN_SENT (2)FIN_WAIT1 (3)FIN_WAIT2 ...

  9. 重学TCP协议(9) 半连接队列、全连接队列

    1. 半连接队列.全连接队列基本概念 三次握手中,在第一步server收到client的syn后,把相关信息放到半连接队列中,同时回复syn+ack给client(第二步),同时开启一个定时器,如果超 ...

最新文章

  1. C#之windows桌面软件第四课:串口助手控制设备的开关
  2. 转发:php解决高并发
  3. 计算机自适应测试的应用 托福,计算机自适应测试系统的研究和应用.pdf
  4. [USACO1.5]回文质数 Prime Palindromes
  5. flash影响中文输入
  6. 单机版简易考试系统开发过程讲解(C#注册机、用户注册、考试系统、×××全部源码)...
  7. 不能使用for循环,传入n和m, 生成一个长度为n,每一项都是m的数组
  8. 讲解Java中的String几种类型
  9. SpringBoot实战(八):集成Swagger
  10. 剑指offer面试题[58]-二叉树的下一个结点
  11. APP 自动化测试封装结构模式
  12. python机器学习库sklearn——降维
  13. spark 的RDD各种转换和动作
  14. Spark SQL概念学习系列之Spark SQL入门(八)
  15. Java单例模式简单代码
  16. 抖音巨量百应怎么入驻?
  17. 基于springboot的打卡签到
  18. 3dmax软件怎样一键取消视图背景网格
  19. 网站优化与seo的方法(seo的优化基础)
  20. 《R语言数据分析》作业答案

热门文章

  1. IDEA快速修改类名和文件名
  2. pthread_detach函数
  3. 做了6年的Java,docker端口映射无法外部访问
  4. Java高级工程师面试实战,mysqlsettimeout
  5. 给后辈的一点建议,面试建议
  6. java bean jsp_JavaBean与Jsp
  7. 正式踏入24岁了……
  8. ubuntu上如何安装tomcat
  9. Java中获取完整的url
  10. Java+Oracle实现事务——JDBC事务