理解socket tcp http tomcat linux的关系

理解socket tcp http tomcat linux的关系

背景

前几天看了一个文章一台Linux服务器最多能支撑多少个TCP连接?。这个问题问道我,我连切入点都没有,揪原因是因为对socket、tcp、http等概念没有区分开,一知半解。这几天梳理了一下,打算记录下来。

问题列表

tcp socket的关系?
tcp http的关系?
tcp tcp/ip的关系

tcp的长短连接的区别? 
Http长连接和TCP长连接的区别?

一个 TCP 连接处理多个几个 HTTP 请求?
tomcat 这种的的web容器可以建立多少tcp连接?
linux系统可以建立多少tcp连接?

回答思路

网络上协议类的文章很多只抛结论,东拼西凑,需通过实验验证真伪

tcp socket的关系?

socket:英文意思:插头、插孔。网络中不同主机上的应用进程之间进行双向通信的端点的抽象。

tcp:Transmission Control Protocol ,传输控制协议。熟悉tcp三次握手、四次断开,主要是应对传输过程中,可能出现的不稳定情况。

类比电脑通过插座从电厂取电:插座的socket、tcp是电的传输

电脑(服务端)》插座 (socket)》电线(tcp) =》插座(socket)=》电厂

tcp tcp/ip的关系

tcp/ip:Transmission Control Protocol/Internet Protocol,传输控制协议\网络协议。是指为不同网络之间通信的一个协议簇。不仅有tcp ip 还有ftp、smtp、http等协议,报文通过协议头进行区分。常说的四层结构:链路层、网络层、传输层、应用层就就tcp/ip的协议簇的分层。

tcp对应在tcp/ip传输层的协议

tcp http的关系?

http:Hyper Text Transfer Protocol,超文本传输协议。架构在tcp上的,实现简单发送-响应的网络协议。

可以看下面的wireshark抓包详细了解他们的关系↓↓↓↓↓

wireshark抓包

tcp/ip的四层抽象

  • tcp三次握手包

在这里插入图片描述

抓包可以看到任意一个网络请求,都分三层或四层。

物理链路层:写得是物理设备,接口等信息

网络层:ip版本 源、目的地址

传输层:TCP还是什么传输协议

应用层: ,因为tcp处于握手建联,所以上层的应用层还在等待中

  • http报文包

在这里插入图片描述

tcp建立连接后,就可以有应用层的信息,这里是http的应用层信息,可以看到访文的是8080的端口

http和tcp关系

上图可以看到,http 和 tcp一个是应用层,一个是传输层协议。是上下游关系。

tcp三次握手、四次断开

发送两个http求解,期间进行抓包,可以看到三次握手和四次断开。

在这里插入图片描述

访问一个http的接口,触发三次握手。

如果server端没有特殊设置,HTTP的keep=Alive时间是60s。60s后触发三次握手

在这里插入图片描述

tcp的长短连接的区别?

短链接:client和server完成一次通信,就close。短链接一般由client端关闭

长连接:出去单次短链接,就是长连接。http协议,默认的tcp长连接是60s。如果长连接时间过长,server将需要保留大量的长连接,server压力不小。长连接一般由server关闭。

Http长连接和TCP长连接的区别?

http的长连接:使用 keep-alive配置,传输层是需要tcp的长连接。http的长连接需要tcp的长连接。

tcp的长连接:有心跳机制,一些旧系统就使用几条特定的长连接做传输,理论上永远不断,了解不多

tomcat 这种的的web容器可以建立多少tcp连接?

由于没有读源码,也没由细究,只是试了一下tomcat的控制tcp连接

tomcat有几个关键指标:tomcat的最大连接数,可以解决为餐厅吃饭,餐厅的排号最大值,超过就不能排队了。

# 最大线程数:餐厅可同时服务座位
server.tomcat.threads.max=10
# 最大连接数:餐厅所有座位
server.tomcat.max-connections=8192
# 排队的请求个数:餐厅的排号最大值,超过就不能排队了
server.tomcat.accept-count=50

当超过了max-connections(座位满了),就再看accept-count(排队拿号),如果排队再满了,就不丢弃。

所以能最大数量是=threads.max + max-connections +accept-count

实验

代码实现

写一个springboot的代码,接口/tcpopen/{sleeptime},使用Jmete使用多线程调用此接口,传入线程睡眠时间模拟业务调用等待,让http继续保存连接。由于Jmete是多线程,所以tcp不会重用。

@RestController
public class tpcLearn {

    @GetMapping("/opentcp/{time}")
    public String openTcp(@PathVariable(value = "time") Long time) {
        System.out.println("hava a visit" + LocalDateTime.now() + ",sleep:" + time);
        try {
            // Thread随眠,模拟业务逻辑
            Thread.sleep(time);
        } catch (InterruptedException e) {
        }
        System.out.println("pass-------");
        return "openTcp:" + LocalDateTime.now();
    }
}

  • max-connections默认8192,可以建立8000多个tcp

在这里插入图片描述

  • max-connections=5,控制tcp连接数量
server.tomcat.threads.max=1
server.tomcat.max-connections=5
server.tomcat.accept-count=10

这时候,1000个线程,只能由16个能建立连接。其余的连接Connection timed out: connect。

1+5+10=16

在这里插入图片描述

  • max-connections=81920,连接更多的tcp

比如我设置为8w个max-connections,使用Jmete建立了10229的连接数,再多的话,内存不足,就卡死了。如果内存足够,就看操作系统的限制了。

在这里插入图片描述

linux系统可以建立多少tcp连接?

篇幅原因,自行查看一台Linux服务器最多能支撑多少个TCP连接?

后记

今天是2022年10月24日,特意写一个博客,程序员节日快乐。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值