理解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日,特意写一个博客,程序员节日快乐。