在使用 epoll 时,客户端正常断开连接(调用 close()),在服务器端会触发一个 epoll 事件。在早期的内核中,这个 epoll 事件一般是 EPOLLIN,即 0x1,代表连接可读。
连接池检测到某个连接发生 EPOLLIN 事件且没有错误后,会认为有请求到来,将连接交给上层进行处理。这样一来,上层尝试在对端已经 close() 的连接上读取请求,只能读到 EOF(文件末尾),会认为发生异常,报告一个错误。
后期的内核中增加了 EPOLLRDHUP 事件,代表对端断开连接。对端连接断开触发的 epoll 事件会包含 EPOLLIN | EPOLLRDHUP,即 0x2001。有了这个事件,对端断开连接的异常就可以在底层进行处理了,不用再移交到上层
简要结论就是epoll是通过锁来保证线程安全的, epoll中粒度最小的自旋锁ep->lock(spinlock)用来保护就绪的队列, 互斥锁ep->mtx用来保护epoll的重要数据结构红黑树
主要的两个函数:
在TCP连接下,如果服务器主动关闭连接(比如ctrl+c结束服务器进程),那么由于服务器这边会出现time_wait状态,所以不能立即重新启动服务器进程。在标准文档中,2MSL时间为两分钟。
如果不进行端口重用的话,客户端可能不受什么影响,因为在客户端主动关闭后,客户端可以使用另一个端口与服务端再次建立连接;但是服务端主动关闭连接后,其周知端口在两分钟内不能再次使用,就很麻烦
HTTP请求内容:请求行,请求头,空行,请求体
一个有报文的请求到服务器时,请求头里都会有content_length,这个指定了报文的大小。报文如果很大的时候,会通过一部分一部分的发送请求,直到结束。当这个过程中,出现多个请求,第一个请求会带有请求头信息,前面一个请求的发送的报文如果没有满时,会把后面一个请求的内容填上,这个操作就叫粘包。这样粘包后,它会通过content_length字段的大小,来做拆包。
https://www.cnblogs.com/thaughtZhao/p/4277941.html
https://blog.csdn.net/m0_38129920/article/details/87454405
浏览器判断方法:用户名,密码输入内容123,点击提示按钮,观察上面提示栏的信息(username和password的值):
1、如果是这样:
username和password均有输入值,则是get提交;
2、如果是这样
username和password均无输入值,则是post提交;但下面的详细信息中必有username和password输入值信息;
服务器判断:解析出状态行,查看请求方法
使用Content-Type字段,说明响应体中的媒体数据类型
https://segmentfault.com/a/1190000002655852
https://blog.csdn.net/weixin_49199646/article/details/112298712
https://www.jianshu.com/p/4aee873d607a
https://blog.csdn.net/luguifang2011/article/details/26134151?ops_request_misc=&request_id=&biz_id=&utm_medium=distribute.pc_search_result.none-task-blog-2alles_rank~default-9-26134151.pc_search_all_es&utm_term=%E5%A4%A7%E6%96%87%E4%BB%B6%E4%BC%A0%E8%BE%93%E7%9A%84%E6%8A%80%E5%B7%A7&spm=1018.2226.3001.4187
https://www.jianshu.com/p/2ffb8cfdc97b