tcp协议-http协议-time-wait-close-wait必知
前言:
tcp四次挥手过程中,谁主动断开,谁有time_wait,被动断开一方会有close_wait
- time_wait:保持端口占用2mls~4min,避免对方还有一些tcp片发往这个端口,新链接受影响。time_wait的缺点:占用内存
- close_wait:被动关闭一方接受到fin信号后马上回复ack表示收到fin信号,同时进入close_wait 状态,等待未传输完成的data继续传输完毕,close_wait状态结束,发送fin信号。即close_wait的目的是等待未传输完成的data继续传输完毕。
http 1.0与1.1
http1.0 默认是短连接,client端主动发起,server端服务完毕后,将连接关毕,client端也借此判断数据发送完毕。所以http1.0时代,服务端容易有较多的time_wait。
- 如果http 1.0协议,client希望使用长连接,需要在header中设置connection:keep-alive
http1.1默认是长连接
- 如果client不希望使用长连接,需要在header中设置connection:close
- 如果server不希望使用长连接,也需要在reponse中设置connection:close
长连接的问题
keep-alive模式带来的问题:此时服务端不关闭连接,客户端如何知道消息内容是否发送完毕(bfe曾经因为对http1.0没有主动关闭连接,导致一些老旧php上的的socket http包因为等待服务端关闭连接判断消息发送完毕而超时)
keep-alive模式下,通过两种方式
- 服务端reqponse设置content-length参数:告知内容大小,客户端收到指定内容长度后即可关闭连接。客户端发送post时也会采用这种方式,如若content-length大于实际发生的值会超时,小于则服务端会响应400。这种模式有缺陷,动态页面服务器也不知道内容大小,只有等内容全准备完毕后才知道,若等到此时发送,效率太低了。
- transfer-encoding:chunked模式:此模式下简单说是规定一直特殊的响应data格式,此种格式中会包含body结束的标志。客户端收到此标志即知道数据发送完毕,可以组装解密数据了。
content-length,transfer-encoding,content-encoding
- transfer-encoding:传输编码,针对传输过程来的,传输完解码才拿到对象。用于在网络传输国财中保证数据安全成功的传输。在http1.1里,如果有transfer-encoding,则必须是chunked,此时不能有content-lengh参数,即使有也会忽略。transfer-encoding相冲突,因为transfer-encoding会通过额外的处理方式来改变数据的组织方式,就会改变实际的数据长度,如果客户端仍按照原content-length来处理的话,则不会接收到完整的数据。
- content-encoding: 内容编码和accept-encoding对应。比如gzip,对于文本有较好的压缩效果。
附两篇很好的文章
1.介绍http:https://www.byvoid.com/zhs/blog/http-keep-alive-header
2.content-length:http://www.tuicool.com/articles/FJ7rye
3.http协议官方文档:http://greenbytes.de/tech/webdav/rfc7230.html#header.content-length
4.http://liupan2668.blog.163.com/blog/static/12038513120140129504967/
tcp协议-http协议-time-wait-close-wait必知的更多相关文章
- 对TCP/IP网络协议的深入浅出归纳
前段时间做了一个开发,涉及到网络编程,开发过程比较顺利,但任务完成后始终觉得有一些疑惑.主要是因为对网络协议不太熟悉,对一些概念也没弄清楚.后来 我花了一些时间去了解这些网络协议,现在对TCP/IP网 ...
- TCP与UDP协议
传输控制协议(Transmission Control Protocol, TCP)和用户数据报协议(User Datagram Protocol, UDP)是典型的传输层协议. 传输层协议基于网络层 ...
- 转:对TCP/IP网络协议的深入浅出归纳
转自:http://blog.jobbole.com/74795/ 前段时间做了一个开发,涉及到网络编程,开发过程比较顺利,但任务完成后始终觉得有一些疑惑.主要是因为对网络协议不太熟悉,对一些概念也没 ...
- 对TCP/IP网络协议的深入浅出归纳(转)
前段时间做了一个开发,涉及到网络编程,开发过程比较顺利,但任务完成后始终觉得有一些疑惑.主要是因为对网络协议不太熟悉,对一些概念也没弄清楚.后来 我花了一些时间去了解这些网络协议,现在对TCP/IP网 ...
- 示例:Netty 处理 TCP数据分包协议
一个.Netty解决TCP协议的数据分包的想法 我们知道通过TCP协议发送接收数据时,假设数据过大.接收到的数据会是分包的.比方: ...
- 关于tcp封装http协议
如果tcp中没有上层协议,那么就是简单的数据包的传输,如果tcp中有上层协议,那么,当客户端把tcp包发给server的时候,server端的socket收到数据包后,从中分离出应用层协议,交给上层继 ...
- TCP和UDP协议的区别
TCP和UDP都是传输层的协议 UDP协议的特点: UDP协议是一种无连接的.不可靠的传输层协议(尽力而为的协议) 为什么说UDP是一种无连接.不可靠的协议呢?UDP协议在传输报文之前不需要在双方之间 ...
- JAVA之旅(三十二)——JAVA网络请求,IP地址,TCP/UDP通讯协议概述,Socket,UDP传输,多线程UDP聊天应用
JAVA之旅(三十二)--JAVA网络请求,IP地址,TCP/UDP通讯协议概述,Socket,UDP传输,多线程UDP聊天应用 GUI写到一半电脑系统挂了,也就算了,最多GUI还有一个提示框和实例, ...
- Android程序员必知必会的网络通信传输层协议——UDP和TCP
1.点评 互联网发展至今已经高度发达,而对于互联网应用(尤其即时通讯技术这一块)的开发者来说,网络编程是基础中的基础,只有更好地理解相关基础知识,对于应用层的开发才能做到游刃有余. 对于Android ...
- netty同端口监听tcp和websocket协议
前言: 软件通信七层结构(osi模型)中由协议套协议最终组成最高级应用层协议(http等等),下三层结构偏向与数据通信,上三层更偏向于数据处理,中间的传输层则是连接上三层与下三层之间的桥梁,每一层都做 ...
随机推荐
- struts2 标签 和 c标签的页面数据显示
用struts2 标签显示的页面代码 <s:if test="#request.employees == null || #request.employees.size() == 0& ...
- iOS运行时工具-cycript
cycript是大神saurik开发的一个非常强大的工具,可以让开发者在命令行下和应用交互,在运行时查看和修改应用.它确实可以帮助你破解一些应用,但我觉得这个工具主要还是用来学习其他应用的设计(主要是 ...
- oracle 小知识
oracle: 数值随机的函数是 dbms_random.value(最大值,最小值) 用法是select dbms_random(3,0) from dual; oracle: 获取前100条 ...
- Android Studio 总结
1:添加插件 File->Setting->plugins->Browse repoistories
- VoxelGrid体素滤波器对点云进行下采样
使用体素化网格方法实现下采样,即减少点的数量,减少点云数据,并同时保持点云的形状特征,在提高配准.曲面重建.形状识别等算法速度中非常实用. PCL实现的VoxelGrid类通过输入的点云数据创建一个三 ...
- Uncaught TypeError: _react2.default.findDOMNode is not a function
react 查找某节点时报错 Uncaught TypeError: _react2.default.findDOMNode is not a function 代码: import React, { ...
- CentOS 6.8 新安装系统的网络IP配置(转载)
实例环境 虚拟机:VMware 11.1.0 系统:CentOS 6.6 # ifconfig -a << 查看所有网卡的状态 2. # vi /etc/sysconfig/n ...
- JS和JQuery总结
目录目录 2js部分一.词法结构 1.区分大小写 2.注意 // 单行 /* 多行注释 */ 3.字面量(直接量 literal) 12 / ...
- Python UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-4: ordinal not in range(128)
#!/usr/bin/python# -*- coding: utf-8 -*- 解决方法: 可以看到我的版本是2.6的,所以打开/usr/lib64/python2.6/site.py 红框里本来是 ...
- javascript_获取浏览器属性
navigator.appName:浏览器名称: navigator.appVersion:浏览器版本: navigator.language:浏览器设置的语言: navigator.platform ...