Socket和TCP的关系
socket、TCP学习记录
开发人员一定都听说过Socket和TCP,但是不一定都有所了解,就像我一样,之前也只是知道有这个东西,但问道具体一点就不知道了。
首先介绍一下TCP
TCP是什么?TCP是一种通信协议,一种面向连接的、可靠的、基于字节流的传输层通信协议。
而我们比较熟知的相关知识点可能就是:三次握手、四次挥手等。
以三次握手为例展开讲解,更方便理解TCP和Socket的关系。
1、客户端发送SYN报文给服务器端,进入SYN_SEND状态。
2、服务器端收到SYN报文,回复一个SYNACK报文,进入SYN_RECV状态
3、客户端收到SYNACK报文,回应一个ACK报文,进入Established状态。
三次握手之后,客户端和服务器建立连接,可以开始传输数据了。
但是可以考虑一点,三次握手是在哪里实现的?是操作系统还是应用中?
当然,这是基于操作系统实现的,以Linux为例,所谓的三次握手,就是三个方法,1、tcp_v4_connect2、tcp_v4_send_synack3、tcp_send_ack,既然是Linux的核心方法,我们自然不能直接调用核心方法,那么以我们后端开发的常识来讲,写好了方法,以供外部使用时,肯定是要定义接口的,接口再去调用方法,那么Socket就是相当于我们的接口,Socket本身并不是什么协议,只是供我们方便使用TCP的一个接口而已。
Socket连接,其实也可以理解为TCP连接。
TCP连接的长短连接
什么是TCP的短连接?
例如一个客户端连接服务器,如果是短连接,客户端发送个服务器的请求中,有个参数connection的值为close,服务器收到之后,相应请求,并且在响应报文中同是返回connection为close,当相应完请求之后,会因为connnection为close,服务器端会关掉此次TCP连接,客户端收到响应,将响应内容处理以后,会因为相应中的connection为close,客户端也关闭此次TCP连接,这种便是短连接
什么是TCP的长连接
所谓长连接,也就是在请求连接的时候,传入参数connnection为keep-alive,服务端在处理一次请求之后,连接不会关闭,还可以继续通过此次TCP连接来通信。
不过也有自动关闭连接的情况:
1、maxKeepAliveRequests:TCP连接参数控制,一次Socket(TCP)连接,最多处理几次请求,当请求达到上限时,也会关闭连接。
2、keepAliveTimeout:表示上一次请求到现在的时间的最大值,如果超过这个值,则关闭连接。
关于keepAliveTimeout参数还有另外一个知识点,大家都知道客户端和服务端建立连接后,会发送数据,那么数据会发送到哪里呢?其实服务端是有个缓存区的,服务端可以到缓存区中去读取客户端发送的数据。而服务端会通过while循环,一直去取数据,如果连续一定时间都没有数据,那么也就关闭连接了。
一次HTTP请求的流程
HTTP请求 —> TCP建立连接 ---->发送报文 -----> 解析报文 ----->解析报文行、报文头、报文体 ------>servlet ------>request -----> 服务器端代码处理 ------>返回response
【备注】仅用于学习记录,如果错误或疑问,请指点,谢谢。