总结:
-
tcp连接,http请求,socket和线程之间的关系?
tcp连接是传输层层面的东西;
http请求是应用层层面的东西线程是操作系统能够进行运算调度的最小单位,注意运算调度这个词,就是涉及到数据的处理运算的相关操作,是需要有人来处理的,这个人就是“线程”。
socket是对TCP等传输协议的一系列操作的抽象;并不是一个等同的关系;可以想象某个TCP连接是一个Socket对象的一个属性,Socket里面有一些列的方法对这个连接进行操作。
一个客户端的http请求,携带这相关的请求数据,通过tcp连接这条通道,传送服务端,有服务端的”人“,就是线程来处理。线程处理请求的数据,返回响应的数据,变更tcp的状态等,需要通过调用socket的相关函数。
猜想:
- tomcat的连接数=处于连接状态(establish)的连接+处于半连接状态(syn-recv)的连接数;不考虑关闭的连接的数量
参考文献知识点摘录
-
断网了,还能ping通 127.0.0.1 吗?
我们启动服务器的时候,一般会 listen 一个 IP 和端口,等待客户端的连接。如果此时 listen 的是本机的 0.0.0.0 , 那么它表示本机上的所有IPV4地址. -
终于搞懂了服务器为啥产生大量的TIME_WAIT!
每一个 time_wait 状态,都会占用一个「本地端口」,上限为 65535(16 bit,2 Byte);TCP 本地端口数量,上限为 65535(6.5w),这是因为 TCP 头部使用 16 bit,存储「端口号」,因此约束上限为 65535。
TCP 连接中,主动关闭连接的一方出现的状态;(收到 FIN 命令,进入 TIME_WAIT 状态,并返回 ACK 命令),保持 2 个MSL 时间,即,4 分钟;(MSL 为 2 分钟)
-
张大胖的socket
TCP是两个进程之间的通信,端口号就是用来区分进程的, 这样IP层发过来的数据包, 到达TCP层以后就可以分发给各个应用程序了socket 必须得通过(协议,客户端IP, 客户端Port, 服务器端IP, 服务器端Port) 来确定
-
不可不知的socket和TCP连接过程
监听套接字的socket buffer只接受TCP连接请求过程中的syn和ack数据;而已建立的TCP连接的socket buffer主要存储的内容是两端传输的"正式"数据,例如服务端构建的响应数据,客户端发起的Http请求数据. -
漫谈http连接
所以,长连接也需要在恰当的时间关闭,不能永远保持与服务器的连接,这在客户端或者服务器都可以做到。在客户端,可以在请求头里加上“Connection: close”字段,告诉服务器:“这次通信后就关闭连接”。服务器看到这个字段,就知道客户端要主动关闭连接,于是在响应报文里也加上这个字段,发送之后就调用 Socket API 关闭 TCP 连接。
服务器端通常不会主动关闭连接,但也可以使用一些策略。拿 Nginx 来举例,它有两种方式:使用“keepalive_timeout”指令,设置长连接的超时时间,如果在一段时间内连接上没有任何数据收发就主动断开连接,避免空闲连接占用系统资源。
使用“keepalive_requests”指令,设置长连接上可发送的最大请求次数。比如设置成 1000,那么当 Nginx 在这个连接上处理了 1000 个请求后,也会主动断开连接。
另外,客户端和服务器都可以在报文里附加通用头字段“Keep-Alive: timeout=value”,限定长连接的超时时间。但这个字段的约束力并不强,通信的双方可能并不会遵守,所以不太常见。