TCP采用传输输连接的方式传送TCP报文,传输连接包括连接建立、数据传输和连接释放三个阶段。 2) TCP连接的建立
TCP连接建立采用“3次握手”方式。
首先,主机A的TCP向主机B的TCP发出连接请求报文段,其首部中的同步位SYN应置1,同时选择一个序号X,表明在后面传送数据时的第一个数据字节的序号是X+1,如图3所示:
主动打开 被动打开
连接请求
确认
确认
图3 TCP连接建立的3次握手过程
然后,主机B的TCP收到连接请求报文段后,若同意,则发回确认。在确认报文段中应将SYN和ACK都置1,确认号应为X+1,同时也为自己选择一个序号Y。
最后,主机A的TCP收到B的确认后,要向B发回确认,其ACK置1,确认号为Y+1,而自己的序号为X+1。TCP的标准规定,SYN置1的报文段都要消耗掉一个序号。同时,运行客户进程的主机A的TCP通知上层应用进程,连接已经建立。当主机A向B发送第一个数据报文段时,其序号仍为X+1,因为前一个确认报文段并不消耗序号。
当运行服务器进程的主机B的TCP收到主机A的确认后,也通知其上层应用进程,连接已经建立。
另外,在TCP连接建立的过程中,还利用TCP报文段首部的选项字段进行双方最大报文段长度MSS协商,确定报文段的数据字段的最大长度。双方都将自己能够支持的MSS写入选项字段,比较之后,取较小的值赋给MSS,并应用于数据传送阶段。 3) TCP数据的传送
为了保证TCP传输的可靠性,TCP采用面向字节的方式,将报文段的数据部分进行编号,每个字节对应一个序号。并在连接建立时,双方商定初始序号。在报文段首部中,序号字段和数据部分长度可以确定发送方传送数据的每一个字节的序号,确认号字段则表示接收方希望下次收到的数据的第一个字节的序号,即表示这个序号之前的数据字节均已收到。这样既做到了可靠传输,又做到了全双工通信。
当然,数据传送阶段有许多复杂的问题和情况,如流量控制、拥塞控制、重传机制等,本次实验不探究。
4)TCP连接的释放
在数据传输结束后,通信的双方都可以发出释放连接的请求。TCP连接的释放采用“4次握手”。如图
ABFIN,SEQ-XACK,SEQ=Y,ACK=X+1FIN,ACK,SEQ=Y,ACK=X+1①②通知主机应用进程确认 应用进程释放连接B不再发送报文 应用进程释放连接A不再发送报文确认ACK,SEQ=X+1,ACK=Y+1
图4 TCP连接释放的4次握手过程
首先,设图4中主机A的应用进程先向其TCP发出释放连接的请求,并且不再发送数据。TCP通知对方要释放从A到B这个方向的连接,将发往主机B的TCP报文段首部的中止位置1,其序号X等于前面已传送过的数据的最后一个字节的序号加1。
主机B的TCP收到释放连接通知后即发出确认,其序号为Y,确认号为X+1,同时通知高层应用进程,如图中的箭头①。这样从A到B的连接就被释放了,连接处于半关闭状态,相当于主机A对主机B说“我已经没有数据发送了。但是如果你还有数据要发送,我仍然接收。”
此后,主机B不再接收A发来的数据。但若主机B还有一些数据要发给A,则可以继续发送(这种情况很少)。主机A只要正确收到数据,仍然向B发送确认。
若主机B不再向主机A发送数据,其应用进程就通知TCP释放连接,如图中的箭头②。主机B发出的连接释放报文段必须将中止位FIN和确认位ACK置1,并使其序号仍为Y(因为签名发送的确认报文段不消耗序号),但是还必须重复上次已经发送过的ACK=X+1。主机A必须对此发出确认,将ACK置1,ACK=Y+1,而自己的序号仍然是X+1,因为根据TCP标准,前面发送过的FIN报文段要消耗掉一个序号。这样就把B到A的反方向的连接释放掉。主机A的TCP再向其应用进程报告,整个连接已经全部释放。
2.4 实验步骤
步骤1 在Wireshark中设置过滤条件,协议为TCP HTTP,地址为本机->any,并开始截获报文;
步骤2打开www.sina.com.,完成后,保存截获的报文并命名为“TCP学号”,分析捕获的报文。
这里,TCP的连接和建立采用的是:三次握手方式,本机是192.168.3.3,远端主机是192.168.3.183。
步骤3 分析TCP连接建立过程的前3个报文,填写下表1:
表1 TCP建立过程的三个报文信息
字段名称 第一条报文 第二条报文 第三条报文 报文序号 Sequence Nunber ACK Number ACK SYN
步骤4 分析截获报文中数据发送部分的第一条TCP报文及其确认报文,将报文中的字段值填写在表格2中。
表2 TCP报文首部信息 字段名 长度 字段值 发送报文 确认报文 字段意义
步骤5 TCP连接建立时,其报文首部与其它TCP报文不同,有一个option字段,它的作用是什么?结合IEEE802.3协议规定的以太网最大帧长分析此数据是怎么得出来的? 步骤6分析TCP数据传送阶段的前8个报文,将报文信息填入表3:
表3 TCP数据传送部分的前8个报文 报文序号 报文种类 序号字段 确认号字段
数据长度 被确认报文序号 窗口 2.5 实验总结
在实验中,通过分析截获的TCP报文首部信息,可以看到首部中的序号、确认号等字段
是TCP可靠连接的基础。
分析TCP头部信息,分析“3次握手”过程。通过对数据传送阶段报文的初步分析,了解数据的编码和确认机制。
总之,TCP协议中的各项设置都是为了在数据传输时提供可靠的面向连接的服务。
2.B 编程构造UDP数据包部分
使用C语言构造UDP数据包程序。 1) UDP首部和伪首部结构体定义 /* UDP 首部*/ struct udphdr{ };
2)构建UDP报文数据 int build_udp_Package(struct socket_pair * sp,const unsigned char *buf,int len,unsigned char *udpPacket[],int *udpPacketLen){ }
//UDP中校验使用的伪首部 struct pseudo_header { };
3. HTTP协议分析
实验目的
在PC机上访问Web 页面,截获报文,分析HTTP 协议的报文格式和HTTP 协议的工作过程。
实验设备和连接
请通过访问可以连接的WWW 站点来进行实验。
实验步骤
步骤1:在PC 机上运行Wireshark,开始截获报文,为了只截获和我们要访问的网站相关的
数据报,将截获条件设置为 “not broadcast and not multicast”;
步骤2:从浏览器上访问Web 界面,如http://202.202.43.125。打开网页,待浏览器的状态
栏出现 “完毕”信息后关闭网页。
步骤3:停止截获报文,将截获的报文命名为“HTTP-学号”保存。
分析截获的报文,回答以下几个问题:
1)综合分析截获的报文,查看有几种HTTP 报文? 答:
2)在截获的HTTP 报文中,任选一个HTTP 请求报文和对应的 HTTP 应答报文,仔细分析它们的格式,填写表20 和表21。
表20 HTTP 请求报文格式
方 法 URL 首部字段名 Accept Accept-Language User-Agent Host Connection
字段值 版 本 字段所表达的信息 表21 HTTP 应答报文格式
版 本 状态码