前言: 

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
http header中keep-alive参数用于设置客户端希望服务端保持连接的秒数

长连接的问题

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必知的更多相关文章

  1. 对TCP/IP网络协议的深入浅出归纳

    前段时间做了一个开发,涉及到网络编程,开发过程比较顺利,但任务完成后始终觉得有一些疑惑.主要是因为对网络协议不太熟悉,对一些概念也没弄清楚.后来 我花了一些时间去了解这些网络协议,现在对TCP/IP网 ...

  2. TCP与UDP协议

    传输控制协议(Transmission Control Protocol, TCP)和用户数据报协议(User Datagram Protocol, UDP)是典型的传输层协议. 传输层协议基于网络层 ...

  3. 转:对TCP/IP网络协议的深入浅出归纳

    转自:http://blog.jobbole.com/74795/ 前段时间做了一个开发,涉及到网络编程,开发过程比较顺利,但任务完成后始终觉得有一些疑惑.主要是因为对网络协议不太熟悉,对一些概念也没 ...

  4. 对TCP/IP网络协议的深入浅出归纳(转)

    前段时间做了一个开发,涉及到网络编程,开发过程比较顺利,但任务完成后始终觉得有一些疑惑.主要是因为对网络协议不太熟悉,对一些概念也没弄清楚.后来 我花了一些时间去了解这些网络协议,现在对TCP/IP网 ...

  5. 示例:Netty 处理 TCP数据分包协议

    一个.Netty解决TCP协议的数据分包的想法 我们知道通过TCP协议发送接收数据时,假设数据过大.接收到的数据会是分包的.比方:                                   ...

  6. 关于tcp封装http协议

    如果tcp中没有上层协议,那么就是简单的数据包的传输,如果tcp中有上层协议,那么,当客户端把tcp包发给server的时候,server端的socket收到数据包后,从中分离出应用层协议,交给上层继 ...

  7. TCP和UDP协议的区别

    TCP和UDP都是传输层的协议 UDP协议的特点: UDP协议是一种无连接的.不可靠的传输层协议(尽力而为的协议) 为什么说UDP是一种无连接.不可靠的协议呢?UDP协议在传输报文之前不需要在双方之间 ...

  8. JAVA之旅(三十二)——JAVA网络请求,IP地址,TCP/UDP通讯协议概述,Socket,UDP传输,多线程UDP聊天应用

    JAVA之旅(三十二)--JAVA网络请求,IP地址,TCP/UDP通讯协议概述,Socket,UDP传输,多线程UDP聊天应用 GUI写到一半电脑系统挂了,也就算了,最多GUI还有一个提示框和实例, ...

  9. Android程序员必知必会的网络通信传输层协议——UDP和TCP

    1.点评 互联网发展至今已经高度发达,而对于互联网应用(尤其即时通讯技术这一块)的开发者来说,网络编程是基础中的基础,只有更好地理解相关基础知识,对于应用层的开发才能做到游刃有余. 对于Android ...

  10. netty同端口监听tcp和websocket协议

    前言: 软件通信七层结构(osi模型)中由协议套协议最终组成最高级应用层协议(http等等),下三层结构偏向与数据通信,上三层更偏向于数据处理,中间的传输层则是连接上三层与下三层之间的桥梁,每一层都做 ...

随机推荐

  1. android技巧(一):如何方便知晓当前Activity?如何管理应用中的Activity?如何最佳的启动一个Activity?

    1.如何方便知晓当前Activity? 可以不看代码根据当前界面就知道界面所在Activity的写法: 建立BaseActivity,继承自Activity,在BaseActivity的OnCreat ...

  2. BFC and Haslayout

    一.BFC(Block Formatting Context) 相关网址:http://www.cnblogs.com/dolphinX/p/3508869.html 1. 怎样才能形成BFC flo ...

  3. BZOJ 1798 (线段树||分块)的标记合并

    我原来准备做方差的.. 结果发现不会维护两个标记.. 就是操作变成一个 a*x+b ,每次维护a , b 即可 加的时候a=1 ,b=v 乘的时候a=v ,b=0 #include <cstdi ...

  4. webApp--cordova 系列1

    1.在node,npm 可用的前提下 npm install -g cordova 大约10分钟后装完,cmd中输入cordova -v  验证是否安装成功 2.cordova项目打包是用ant完成, ...

  5. GO RPC

    HTTP RPC SERVER CODE package main import ( "errors" "fmt" "net/http" & ...

  6. PHP中常用的函数

    1.php 字符串截取函数 2.php取得当前时间函数 3.php 字符串长度函数 4.几种php 删除数组元素方法 5.php中var_dump()函数的详解说明 6.PHP preg_match正 ...

  7. python执行linux的shell命令

    python执行shell脚本常用的方法 import os val=os.system("shell语句")  >>> val=os.system(" ...

  8. Spring MVC 拦截 js,css,png 等资源

    springMVC的<mvc:resources mapping="***" location="***">标签是在spring3.0.4出现的,主 ...

  9. javaScript 1

    js 字符串 1. 必须在写在一行,写在多行会报错,可以用 / 分开写在多行 也可以用 “+” 连接 . ===> /转义字符   /r/n:  (以下来在百度) \r是回车,英文是Carria ...

  10. 排序算法总结(四)快速排序【QUICK SORT】

    感觉自己这几篇都是主要参考的Wikipedia上的,快排就更加是了....wiki上的快排挺清晰并且容易理解的,需要注意的地方我也添加上了注释,大家可以直接看代码.需要注意的是,wikipedia上快 ...