与UDP不同的是,TCP提供了一种面向连接的、可靠的字节流服务。TCP协议的可靠性主要有以下几点保障:
(1)应用数据分割成TCP认为最适合发送的数据块。这部分是通过“MSS”(最大数据包长度)选项来控制的,通常这种机制也被称为一种协商机制,MSS规定了TCP传往另一端的最大数据块的长度。值得注意的是,MSS只能出现在SYN报文段中,若一方不接收来自另一方的MSS值,则MSS就定为536字节。一般来讲,在不出现分段的情况下,MSS值还是越大越好,这样可以提高网络的利用率。
(2)重传机制。设置定时器,等待确认包。
(3)对首部和数据进行校验。
(4)TCP对收到的数据进行排序,然后交给应用层。
(5)TCP的接收端丢弃重复的数据。
(6)TCP还提供流量控制。(通过每一端声明的窗口大小来提供的)
1.TCP/IP 协议数据封装的过程
以传输层采用TCP或者UPD、网络层采用IP、链路层采用Ethernet为例,可以看到TCP/IP中报文的封装过程如图所示。用户数据经过应用层协议封装后传递给传输层,传输层封装TCP头部,交给网络层,网络层封装IP头部后,再交给数据链路层,数据链路层封装Ethernet帧头和帧尾,交给物理层,物理层以比特流的形式将数据发送到物理线路上。
不同的协议层对数据包有不同的称谓,在传输层叫做段(segment),在网络层叫做数据报(datagram),在链路层叫做帧(frame)。数据封装成帧后发到传输介质上,到达目的主机后每层协议再剥掉相应的首部,最后将应用层数据交给应用程序处理。
目的主机收到数据包后,如何经过各层协议栈最后到达应用程序呢?整个过程如下图所示。
以太网驱动程序(网卡)首先根据以太网首部中的“上层协议”字段确定该数据帧的有效载荷(payload,指除去协议首部之外实际传输的数据)是IP、ARP还是RARP协议的数据报,然后交给相应的协议处理。假如是IP数据报,IP协议再根据IP首部中的“上层协议”字段确定该数据报的有效载荷是TCP、UDP、ICMP还是IGMP,然后交给相应的协议处理。假如是TCP段或UDP段,TCP或UDP协议再根据TCP首部或UDP首部的“端口号”字段确定应该将应用层数据交给哪个用户进程。IP地址是标识网络中不同主机的地址,而端口号就是同一台主机上标识不同进程的地址,IP地址和端口号合起来标识网络中唯一的进程。
注意,虽然IP、ARP和RARP数据报都需要以太网驱动程序来封装成帧,但是从功能上划分,ARP和RARP属于链路层,IP属于网络层。虽然ICMP、IGMP、TCP、UDP的数据都需要IP协议来封装成数据报,但是从功能上划分,ICMP、IGMP与IP同属于网络层,TCP和UDP属于传输层。
2.TCP/IP 数据包
我们通过 Wireshark 抓包:就分别看到五层数据:
第一行Frame 3339:物理层数据帧:线路83字节,实际捕获83字节
第二行Ethernet II:链路层网卡,以太网协议版本II,源地址:厂名_序号(网卡地址),目的:厂名_序号(网卡地址)
第三行Internet Protocol Version 4:网络层ip数据包,IPV4,源IP地址:10.44.13.7;目的IP是:10.171.8.154
第四行Transmission Control Protocol:传输层TCP数据包:源端口21000,目的端口:52529;Seq序列号:每发送一个RTP数据包,序列 号就加1;ACK是TCP数据包首部中的确认标志,对已接收到的TCP报文进行确认,其为 183589表示确认号有效;Len长度是17字节;
第五行data:数据
整个数据封装的格式如下图所示:
Wireshark显示的下面这些数据信息的顺序与各数据包内各字段的顺序相同,其他帧的内容展开与此类似。
帧号 时间 源地址 目的地址 高层协议 包内信息概况
No. Time Source Destination Protocol Info
1 0.000000 202.203.44.225 202.203.208.32 TCP 2764 > http [SYN] Seq=0 Len=0 MSS=1460 源端口>目的端口[请求建立TCP链接]
第一层物理层的数据帧概况
Frame 1 (62 bytes on wire, 62 bytes captured) 1号帧,线路62字节,实际捕获62字节
Arrival Time: Jan 21, 2008 15:17:33.910261000 捕获日期和时间
[Time delta from previous packet:0.00000 seconds]此包与前一包的时间间隔
[Time since reference or first frame: 0.00 seconds]此包与第1帧的间隔时间
Frame Number: 1 帧序号
Packet Length: 62 bytes 帧长度
Capture Length: 62 bytes 捕获长度
[Frame is marked: False] 此帧是否做了标记:否
[Protocols in frame: eth:ip:tcp] 帧内封装的协议层次结构
[Coloring Rule Name: HTTP] 用不同颜色染色标记的协议名称:HTTP
[Coloring Rule String: http || tcp.port == 80] 染色显示规则的字符