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. SQL Server 的锁定和阻塞
  2. 一天搞定CSS:文本text--05
  3. 百度统计 java 实现思路_2019社招阿里、腾讯、蚂蚁金服「四面」Java面试真题分享...
  4. java线程知识梳理_Java多线程——多线程相关知识的逻辑关系梳理
  5. linux c 调用c程序,Linux C调用C++库(用C封装C++接口)
  6. spark-sql 方差和标准差
  7. matlab有限差分法求解温度场,动静压轴承油膜温升MATLABFLuENT有限差分法硕士论文...
  8. 区间多目标优化算法IP-MOEA
  9. 咦,我发现了微信的一个秘密
  10. win2008 r2折腾php7.1记录
  11. 计算机图形学 构成立方体数据结构的简单表结构,计算机图形学-沈工大作业管理ppt课件...
  12. 银河麒麟桌面操作系统V10日常使用说明
  13. 数据、数据库、数据库管理系统、数据库系统的概念
  14. Computer:成功解决在WPS中合并论文中两个文档(比如将另一个封皮的文档合并在当前文档当中)
  15. W10打开bat文件一闪就没了
  16. java基于springboot校园视频监控管理系统
  17. Linux 修改apt-get为国内镜像源
  18. ERP实施流程的步骤
  19. 深度学习中关于模型融合问题
  20. 球球音响机器人怎么合成的_DIY低成本、便携、震撼的USB音箱(制作过程、原理图)...

热门文章

  1. System V 信号量
  2. 你知道如何用面向对象思想写好并发编程吗?
  3. 阿里P8大佬亲自讲解!朝阳java培训
  4. 阿里P8亲自讲解!java分布式需要学什么技术
  5. 开发人员怎么看实施人员
  6. 学习Spring Data JPA
  7. iOS https双向配置
  8. AutoMapper的介绍与使用(二)
  9. jquery插件dataTables自增序号。
  10. php实现一个简单的四则运算计算器