主要介绍TCP链接,TCP性能考虑,TCP的三次握手。
http链接实际上就是tcp链接及其使用规则。要弄懂http,必须弄懂tcp。
1.tcp/ip的七层架构
我们先复习一下tcp/ip的七层架构。
2.TCP的三次握手
TCP(Transmission Control Protocol) 传输控制协议
TCP是主机对主机层的传输控制协议,提供可靠的连接服务,采用三次握手确认建立一个连接:
位码即tcp标志位,有6种标示:SYN(synchronous建立联机) ACK(acknowledgement 确认) PSH(push传送) FIN(finish结束) RST(reset重置) URG(urgent紧急)
Sequence number(顺序号码) Acknowledge number(确认号码)
第一次握手:主机A发送位码为syn=1,随机产生seq number=1234567的数据包到服务器,主机B由SYN=1知道,A要求建立联机;
第二次握手:主机B收到请求后要确认联机信息,向A发送ack number=(主机A的seq+1),syn=1,ack=1,随机产生seq=7654321的包
第三次握手:主机A收到后检查ack number是否正确,即第一次发送的seq number+1,以及位码ack是否为1,若正确,主机A会再发送ack number=(主机B的seq+1),ack=1,主机B收到后确认seq值与ack=1则连接建立成功。
完成三次握手,主机A与主机B开始传送数据。
http事务延迟
http事务的时延有几个原因。
1.URI转成IP,http客户端都有一个小的DNS缓存。
2.每条链接会有链接建立的时延。
3.请求处理
3.回送http相应
TCP的相关延迟
1.TCP链接建立握手
2.TCP慢启动拥塞
3.数据聚集的Nagle算法
4.用于携带确认的TCP延迟确认算法
5.TIME_WAIT时延和端口耗尽
1.TCP链接建立握手
但你花费这些时间建立链接,传输数据少,不靠谱。小的http事务会花费50%的时间进行TCP链接,HTTP会有重用现存链接,减少TCP建立链接造成的影响。也就是持久链接关键字keep-alive。
两种:HTTP/1.0+ "keep-alive" 已经不再使用。服务器不一定同意keep-alive会话。
HTTP/1.1 “persistent”
Connection: keep-alive
Keep-Alive:max=5,timeout=120 最多为5个事务服务,保持链接空闲120秒。
Keep-alive链接的限制和规则
1.要有content-length
2.不应该与无法确定是否支持Connection首部的呆梨服务器建立keep-alive链接。
服务器支持会回送一个Connection:keep-alive 如:http://www.woyaofun.com/
盲中继,就是代理不会处理同一条链接的其他请求,建立不了长链接。
作为代理是不能转发connection首部的。
HTTP/1.1 persistent链接。
2.TCP慢启动拥塞
防止因特网得突然过载,每成功接受到一个分组,发送端就有路发送另外两个分组得权限。
3.数据聚集的Nagle算法
Nagle算法的基本定义是任意时刻,最多只能有一个未被确认的小段。 所谓“小段”,指的是小于MSS尺寸的数据块,所谓“未被确认”,是指一个数据块发送出去后,没有收到对方发送的ACK确认该数据已收到。
Nagle算法的规则(可参考tcp_output.c文件里tcp_nagle_check函数注释):
(1)如果包长度达到MSS,则允许发送;
(2)如果该包含有FIN,则允许发送;
(3)设置了TCP_NODELAY选项,则允许发送;
(4)未设置TCP_CORK选项时,若所有发出去的小数据包(包长度小于MSS)均被确认,则允许发送;
(5)上述条件都未满足,但发生了超时(一般为200ms),则立即发送。
4TIME_WAIT时延和端口耗尽
当某个TCP断电关闭TCP链接时,会在内存中维护一个小的控制快,用来记录最近所关闭链接的IP地址和端口号。缓存小于两分钟。