网络编程大并发实战-基础概述

作为基础介绍的篇章,网络编程大并发要介绍的基础还是计算机网络的基础。网络基础的内容其实还是很多的,本篇只做一个指引性的介绍,如果要了解详情还是推荐查看书籍《网络编程卷一套接字》。本篇主要介绍网络协议及sock相关知识点.

在大学的时候我们应该都学过OSI网络体系都是分7层,但实际上的上的TCP/IP网络编程都是是5层,甚至作为程序员我们只关注4,3层相关的协议内容。具体见下图:

image

主要从数据流向连接关系两个方向介绍下传输层,网络层,网络接口层的内容及功能,当然还有一些基本概念。

 

连接关系

各层在连接中解决的问题

网络接口层(数据链路层)

网络接口层主要以网卡的MAC地址作为识别对象,借助网卡,集线器双绞线通过太网协议(广播的方式)等实现(同一网络)不同机器之间的数据通讯。协议规定传输的单位数据为一组电讯号组成的数据包叫:帧。同时一般来说每次帧大小的限制为 1518字节。这一层功能保证数据在物理设备上的无错误传输。

网络层

以太网协议可以实现同一局域网内不同机器之间的数据通讯。而网络层,主要以IP地址为识别对象,借助路由器通过IP协议等实现不通子网的数据通讯。这一层传输的是IP数据包。大小为同时IP协议的功能是无连接数据报传输、数据报路由选择和差错控制。其可靠性需要靠传输层保障。

传输层

有上面两个分层的协议及mac地址及IP地址的时候,我们已经可以在无限制的任意网络中的两台主机进行数据通讯了,而传输层可以将通讯数据准确的定位到具体的程序进程中。其依靠端口号为识别对象 (在网卡中绑定端口号及进程号),借助网卡通过TCP协议等实现进程之间的通讯。这一层中,TCP协议传输对象是数据段,UDP协议传输对象是数据报。

小结:基于分层协议,借助网卡,网关,路由器等为载体,以mac地址,ip地址,端口为识别对象,使得数据能够在任意位置的进程间进行通讯。

数据流向

  进行数据通讯过程中的各层数据流向及条件。

image

 

image

(TCP/IP数据流向)

基础概念

PCI:  协议控制信息

PDU:协议数据单元(计算机网络对等层协议交换数据的单位信息)

SDU: 服务数据单元((层与层协议之间的交互)层用户与层协议之间的传递数据单位信息)

SDU(n)  = xPDU(n+1) ;             

PDU(n) = PCI(n)+ySDU(n) = PCI(n)+zPDU(n+1);        (x,y,z>0)

segment(分节):TCP传输层的PDU。

传输层

应用层的数据字节流,并且大小不一,而到了传输层,其传输的应用层数据就要被切分格式化层message,如果是TCP协议,则为segment,这个协议传输的大小一般需要小于 MSS及MTU,原因是为了传输效率,如果把每一层的数据协议容量大小叠加起来看成漏斗,为了在传输过程中不卡壳数据重新切分(这样做会增加传输协议头相关的内容),那么最好在一开始的传输层就把数据切分处理好,方便直接通行。同时MSS这个阈值是在计算机作为参数设置的,所以也是作为调优的手段。

网络层

网络层的PDU是IP数据报,其中,IPV4协议的规定的最大容量是65535字节,IPV6协议规定的容量是65575字节,在看了后面的网络接口层厚我们可以知道这一层中容量不会成为这个传输漏斗的瓶颈。

网络接口层(链路层)

网络接口层的PDU 是 frame, 由于以太网传输电气方面的限制,每个以太网帧都有最小的大小64bytes,最大不能超过1518bytes。当两台远程PC互联的时候,它们的数据需要穿过很多的路由器和各种各样的网络媒介才能到达对端,网络中不同媒介的MTU各不相同,就好比一长段的水管,由不同粗细的水管组成(MTU不同 :))通过这段水管最大水量就要由中间最细的水管决定。同时当今的网络设备一般都支持本端网络接口层在通信前一般就会先检测出整个链路的 MTU。

小结:

从上面我们可以得出数据的流向,及其一些特性,为了在网络层不将数据进行分片,从而导致数据头传输增加,传输顺序变化等一些问题的产生,一般我们需要在传输层就把segment数据的大小限制住,这样三层结构的容量形状就如果一个菱形如下:

image

MSS的大小调整一般需要有MTU决定。

 

SOCKET

TCP连接与分组交换

 

 

image

为了建立一个可靠的TCP连接并传输数据,从图中我们看到,前3个分节用于建立连接(三路握手),最后四个分节用于终止连接。同时为了保证可靠传输,在数据应答中捎带了一个应答确认的请求(ACK),客户端还必须发送1个应答分节,为了传输一个小于服务器通告的最大分节的数据(MSS),需要至少额外 8 个分节的辅助才能完成。

但是这额外的八个分节开销给我们提供了诸如如下的特性:可靠性,动态估算客户端与服务器往返时间(RTT算法),分节排序,重传,拥塞控制(通告窗口:告知对端任何时刻它一次性能够接收多少字节数据,MSS:本连接每个分节能够接收数据大小,都在 SYN 连接分节中设置告知对端),全双工(在一条建立的连接上即可以发送数据也可以接收数据),最大分节生命周期MSL。

为了减少数据开销,目前也有把UDP协议在应用层封装上部分TCP的特性进行可靠的UDP数据通信。

上述的TCP通信状态中需要特别说明下 TIME_WAIT 状态,该停留时间最大为2倍的最大分节生命周期,2*MSL,而MSL一般为30秒左右。同时每个IP数据报都有一个TTL,限跳阈值,防止路由回路等迷路现象。TIME_WAIT 的存在有如下两个作用:

当ACKN+1丢失后,允许接收端在TIME_WAIT内重新接收到对端发来的FIN N。可靠的实现全双工连接的终止。

当某个老的重复分节数据因为回路修复等在超过MSL的时间内重新出现后,新的连接就可能收到老的分节,TIME_WAIT保证在在关闭当前连接后的TIME_WAIT时间内不能重新发起新的连接,当前连接需要等待2MSL时间才会回到初始状态,即直到所有老的分节都过期消逝。这就允许了老的重复分节的消逝。

在本进程用socket:close()关闭一个链接,会进入TIME_WAIT状态,从应用层来看该连接已经不能使用该,但从传输层来说,还是会尝试吧sendbuffer 都发送出去再发起4次握手进行连接的关闭。如果是个多进程,socket:close 只会把引用计数减一,其他进程还是可以使用该链接。

而使用该socket :shutdown,可以选择关闭数据流通方向,不可读,不可写,双边不可用。同时该效果会作用在其他进程。

 

完结

参考:

《UNIX网络编程卷1:套接字联网API》

《计算机网络》

http://www.ruanyifeng.com/blog/2012/05/internet_protocol_suite_part_i.html

 

返回

《网络编程大并发实战-基础概述》有1个想法

发表评论

电子邮件地址不会被公开。 必填项已用*标注

您可以使用这些HTML标签和属性: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>