TCP/IP协议图解

联网的各个终端之间能否进行交互的软件基础是网络协议栈,目前主流的网络协议栈是TCP/IP协议栈

image

image

image

image

1、主机到网络层协议:以太网协议

主机到网络层主要为IP协议和ARP协议提供服务、发送和接收网络数据报。本层中由于要实现跨网和跨设备的互通,有很多的实现方式,这里我们只关注以太网的实现方式。

以太网是由数字设备公司(Digital Equipment Corp,DEC)、英特尔公司和Xerox公司在1982年公布的一个标准。目前TCP/IP技术主要基于以太网标准。以太网标准采用一种带冲突检测的载波监听多路接入(CSMA/CD,Carrier Sense,Multiple Access with Collision Detection)的方法进行传输。以太网的封包格式如下图所示,它在IP数据的基础上增加了共14个字节。

image

源地址和目的地址:以太网用48bits(6字节)来表示源地址和目的地址。这里的源地址和目的地址指的是硬件地址,例如网卡的MAC地址。

在地址后面是两个字节的表示类型的字段,例如0800表示此帧数据为IP数据,0806表示此帧数据为ARP请求。

类型字段之后是数据,对于以太网,规定数据段的大小范围是46-1500个字节,如果数据不足46个字节,则要用空字符填满。

注意:数据段的长度有一个最大值,以太网为1500,这个特性称为MTU,即最大传输单元。如果IP层有一个要求传送的数据长度比MTU大,那么在IP层要对数据进行分片,使得每个片都小于MTU。

CRC字段用于对帧内数据进行校验,以保证数据的正确性,通常由硬件实现(例如在网卡设备中实现)。

注意:以太网的头部长度为14的特点在某些平台的实现上会造成效率上的问题,例如4字节对齐的平台,在取得IP数据时通常会重新复制一次。

2、IP协议

IP协议是TCP/IP协议中最重要的协议,它为TCP、UDP、ICMP等协议提供传输的通路。IP层的主要目的是提供子网的互联,形成较大的网络,使不同的子网间能够传输数据。IP层主要有如下作用:

image

IP数据的格式如下图所示,不包含选项字段,其头部长度为20字节。

image

源IP地址和目的IP地址:源地址表示发送数据的主机或设备的IP地址,目的地址表示接收数据的主机IP地址。这两个字段均为32位。本字段的目的在于识别Internet上的主机。

3、网际控制报文协议(ICMP)

ICMP协议用于传递差错信息、时间、回显、网络信息等报文控制数据。

ICMP协议的数据位于IP字段的数据部分,它是在IP报文的内部被传送的。

image

ICMP报文的数据格式如下图所示:

image

ICMP的报文类型由类型和代码两个字段共同决定。

4、传输控制协议(TCP)

传输控制协议(Transmission Control Protocol),简称TCP协议,它在原有IP协议的基础上,增加了确认重发、滑动窗口和复用/解复用等机制,提供一种可靠的、面向连接的、字节流服务

首先,TCP提供客户和服务器的连接。

其次,TCP提供可靠性。(数据的可靠投递或故障的可靠通知)并不能保证数据一定会被对方端点接收。

第三,TCP通过给所发送数据的每一个字节关联一个序列号进行排序(sequencing)。

第四,TCP提供流量控制(flow control)。TCP总是告诉对端它能够接收多少字节的数据,这称为通告窗口(advertised window)。该窗口在任何时刻都指出接收缓冲区中的可用空间,从而确保发送端发送的数据不会溢出接收缓冲区。该窗口时时刻刻动态地变化着:当接收来自发送端的数据时,窗口大小减小;而当接收端应用进程从缓冲区中读取数据时,窗口大小增大。

最后,TCP的连接是全双工的(full duplex)。

TCP的特点:

image

TCP的数据格式:

image

image

源端口号和目的端口号:这两个字段均为16位的长度,表示发送端和接收端的端口,用于确认发送端和接收端的应用程序发送端的IP地址和端口号以及接收端的IP地址和端口号可以确认一个在Internet上的TCP连接。

image

TCP的封装解封过程:

image

建立TCP连接的三次握手:

(1)服务器必须准备好接受外来的连接。这通过调用socket、bind和listen函数来完成,称为被动打开(passive open)。

(2)客户通过调用connect进行主动打开(active open)。这引起客户TCP发送一个SYN(表示 同步)分节(segment),它告诉服务器客户将在(待建立的)连接中发送数据的初始序列号。一般情况下SYN分节不携带数据,它只含一个IP头部、一个TCP头部及可能有的TCP选项。

(3)服务器必须确认客户的SYN,同时自己也得发送一个SYN分节,它含有服务器将在同一连接中发送的数据的初始序列号。服务器以单个分节向客户发送SYN和对客户SYN的ACK(表示确认)。

(4)客户必须确认服务器的SYN。

连接建立的过程至少需要交换三个分组,因此称之为TCP的三路握手(three-way handshake)。如下图所示:

image

上图中给出的客户的初始序列号为J,而服务器的初始序列号为K。在ACK里的确认号为发送这个ACK的一端所期待的对端的下一个序列号。

建立TCP连接的日常系统可类比电话系统,客户(呼叫者)、服务器(被呼叫者):

soket函数等同于有电话可用。呼叫者和被呼叫者都要有一个电话。

bind函数用于告诉其他人你的电话号码,让他们可以向你打电话。

listen函数用于打开电话振铃,它使得你可以听到一个外来的电话。

accept函数等同于被呼叫者接电话,而且accept函数有来电显示功能,可以显示呼叫者的电话号码。

释放TCP连接的四次握手:

image

TCP状态转换图:

TCP连接的建立和终止可以用状态转换图(state transition diagram)来说明。

 

TCP为一个连接定义了11种状态(nestat命令的输出包括这些状态,它是调试客户/服务器应用程序有用的工具),并且TCP规则规定如何基于当前状态及在该状态下接收的分节从一个状态转换到另一个状态。

我们用实线表示客户的状态转换,虚线表示服务器的状态转换。

image

注意,执行主动关闭的那一端(客户端)进入TIME_WAIT状态。该端点停留在这种状态的持续时间是最长分节生命期(maximum segment lifetime,简称MSL)的两倍,有时候称之为2MSL。

 

5、用户数据报文协议(UDP)

UDP是一种基于IP协议的无连接、不可靠网络传输协议。

image

UDP协议把应用程序需要传递的数据发送出去,不提供发送数据包的顺序;接收方不向发送方发送接收的确认信息,如果 出现丢包或者重包的现象,也不会向发送方发送反馈,因此不能保证使用UDP协议的程序发送的数据一定到达了接收方或者到达接收方的数据顺序和发送方的一致性。

使用UDP协议传输数据的应用程序,必须自己构建发送数据的顺序机制和发送接收的确认机制,以此来保证发送数据的正确到达,保证接收数据的顺序与发送数据的一致性,也就是说应用程序必须根据UDP的缺点提供解决方案。

UDP协议相对于TCP协议执行时的速度要比TCP快得多,因为UDP协议简单的多,对系统造成的负载低。

UDP的数据格式:

image

源端口号和目的端口号分别是一个16位的字段,用来表示发送方和接收方的UDP端口。

UDP数据的传输过程:

image

每个UDP数据报都有一个长度。如果数据报正确地到达其最终目的地,那么数据报的长度将随数据一道传送给接收端应用程序。而TCP是一个字节流(byte stream)协议,没有任何记录边界。

posted on 2018-03-04 14:58  wsw_seu  阅读(5192)  评论(0编辑  收藏  举报

导航