TCP连接管理

在web编程中,我们应用最多的就是HTTP协议,而几乎所有HTTP通信都是由TCP/IP承载完成的;服务端通信时一般基于性能考虑,都会直接启用tcp连接传输数据,下面我们就一起探讨一下TCP工作的机理。

1、TCP/IP报文格式:

TCP是可靠连接,可靠的意思是指TCP会为上层的应用层协议提供一条可靠的比特传输管道,从TCP连接的一端填入的字节会从另一端以原有的顺序、正确地传送出来。

TCP收到上层数据流后,会将数据流砍成称作段的小数据块,然后将段封装在IP分组中,一般的IP分组中包括:

  • 一个IP分组首部(一般20个字节)
  • 一个TCP段首部(一般20个字节)
  • 一个TCP数据块(0或者多个字段)

具体的IP分组数据结构如下:


2、TCP连接编程实现

如何区分唯一的一个连接呢,答案是:<源IP地址、源端口号、目的地IP地址、目的地端口号>唯一的确定一条连接,通常的实现我们都采用套接字编程来实现,套接字API底层协议隐藏了具体实现的细节,我们只需要如下步骤即可实现:

本地创建一个本地套接字(new socket)

绑定本地端口号和接口(bind ip and port)

等待建立合法的连接后(listen and connection)

从套接字缓冲区读取数据(read)

返回响应数据(response)

关闭连接(close)

3、TCP的连接握手

我们都知道建立一条TCP连接时,通常需要经历三次握手过程:

(1) 请求新的TCP连接时,客户端要向服务器发送给一个小的TCP分组,分组中设置了一个特殊的SYN标记,说明这是一个连接请求

(2) 服务器接受连接,对连接参数进行计算,并将SYN标记与计算好的ACK标记一并回传

(3) 客户端收到信息后向服务器发送一条确认信息后,就可以在本次确认分组中发送数据

通常我们的http发生延时的可能性原因如下:

DNS解析系统将URI中的主机名转换成IP时可能花费长达数十秒的时间

客户端向服务端发送TCP连接请求时,一般最多延时只有一两秒,但如果服务端同时要建立的连接过多时,时延值还会迅速叠加

服务器建立连接后,读取报文并开始处理请求,浏览器端一般可通过调试工具即可看到各阶段的响应情况

回传响应数据花费时间过长

性能提升:

为了防止网络的过载和拥塞,我们可以通过几个措施来提高响应速度:

通道复用:如果每次请求都要建立一条连接的话,是不是很浪费时间呢,就像我们的后端任务一样,每个耗费很短的任务都建立一个线程,在内存上开辟新的空间与线程上下文的切换上需要付出投入产出比不高的代价,如果传输的数据很小时,TCP通道的连接时间甚至可以占用整个响应时间的50%以上,这是我们就可以将在connection首部发送建立长连接的请求,待服务器同意后下次连接就可以复用上次已建立好的通道进行传输

慢启动:在TCP建立的初期,限制传输的性能,待发送成功后,再赋予更高的传输速度,这样可以防止网络的突然过载和拥塞

延迟确认:因为因特网无法保证可靠的传输,所以TCP必须自己来完成,由于每次每个段的接收者在收到完好的段时,都会回送确认分组数据,但如果发送者没有收到确认数据时,就会任务数据丢失需要重新发送,延迟确认算法通常会在100~200ms内将输出确认存放在缓冲区内,以寻找能捎带它的输出数据分组,如果上述时间段内没有输出数据分组,才会单独发送输出确认数据。

Nagle算法:TCP的数据流接口可以将任意尺寸的数据放入TCP栈中,如果每次标记和首部占用很大的分组比,却只传送了少量数据,网络利用率和性能就会严重下降,Nagle算法鼓励在发送一个分组之前,将大量TCP数据绑定在一起传输,以提高网络效率。

TIME_WAIT累积与端口耗尽:当某个TCP端点关闭时,在内存中维护一个小的控制块,用来记录所关闭连接的IP和端口号,过期时间一般为最大分段使用期的两倍,以确保在这段时间内不会创建具有相同地址和端口号的新连接。

并行连接:即通过多条TCP连接发起HTTP并发的请求,例如一个页面上有很多图片,如果同时加载的话,可以将时间缩减至1/n.

管道化连接:共享TCP连接发起请求,但使用管道化连接必须做好失败重发以及幂等性判断判断。当客户端发出10条请求,但服务器响应5条后关闭连接,这时就得重发失败的5条请求;同时,服务端要做好重复处理的判断,即相同的输入输出结果是一致的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值