实验楼_TCP/IP网络协议基础_Note05_S6

来源:互联网 发布:广智软件安装 编辑:程序博客网 时间:2024/05/02 01:35

S6  传输层:TCP协议


一、TCP特点

1. 面向连接

2. 可靠传输:无差错、不丢失、不重复、按顺序

3. 点对点:TCP连接的两端都设有发送缓存和接收缓存

4. 全双工



二、TCP报文段结构

TCP报文段的报头有前20字节的固定部分,后面4n字节是根据需要而添加的字段。


1. 序号:占4字节序,序号范围[0, 2^32-1],序号增加到2^32-1后,下个序号又回到0。

2. 控制位:共有6个控制位,说明本报文的性质,意义如下:

  • URG紧急:当 URG=1时,它告诉系统此报文中有紧急数据,应优先传送(比如紧急关闭),这要与紧急指针字段配合使用。
  • ACK确认:仅当ACK=1时确认号字段才有效。建立TCP连接后,所有报文段都必须把ACK字段置为 1。
  • PSH推送:若TCP连接的一端希望另一端立即响应,PSH字段便可以“催促”对方,不再等到缓存区填满才发送。
  • RET复位:若TCP连接出现严重差错,RST置为1,断开TCP连接,再重新建立连接。
  • SYN同步:用于建立和释放连接。
  • FIN中止:用于释放连接,当FIN=1,表明发送方已经发送完毕,要求释放TCP连接。



三、连接建立与释放

1. 三次握手



2. 四次挥手




四、其他

超时重传与ARQ协议

流量控制和拥塞控制






S6  尝试抓取一个TCP数据报,并解读其内容


STEP 01

需要下载从github下载代码,是基于TCP的聊天小程序,分为Server(服务端)和Client(客户端):


cd Desktopgit clone https://github.com/shiyanlou/tcp_ip_6
sudo apt-get updatesudo apt-get install tcpdumpsudo tcpdump -vvv -X -i lo tcp port 7777



STEP 02

编译完成后先不要运行,先打开tcpdump,使用命令安装并运行tcpdump:


sudo apt-get updatesudo apt-get install tcpdumpsudo tcpdump -vvv -X -i lo tcp port 7777



STEP 03

最小化运行tcpdump的终端,然后另开一个终端,运行Server程序:


cd Desktop/tcp_ip_6./server 127.0.0.1



STEP 04

然后再打开第三个终端,运行Client程序:


cd Desktop/tcp_ip_6./client 127.0.0.1



STEP 05

先来看下数据报文的结构:


黄色为TCP报文头部;

紫色为TCP报文段的数据部分;

·为非常重要的部分,包括:数据偏移、保留位和六个控制位。

--> 0x0020 后面第一个四位数据,例如 a002, 转换成 2 进制为 1010 0000 0000 0010,包括数据偏移4位:1010, 6位保留位:000000,6位控制位:000010(分别对应URG ACK PSH RST SYN FIN)。



STEP 06

现在,使用Client和Server聊天,轮流互发几条简短的消息(比如 hello、hi之类的)便可以关闭Client和Server,回到运行tcpdump的终端查看抓取的报文段内容:

1. Client(端口号 60556)与Server(端口号 7777)建立连接


观察一下建立连接的【三次握手】:



结合上文 三次握手 的示意图,大概可以理解为:

①Client向Server发消息:不如交个朋友(SYN = 1);

ServerClient发消息:收到你的信息(ACK = 1),同意交个朋友(SYN = 1);

Client向Server发消息:收到你的信息(ACK = 1)。

成功做朋友。


2. 相互发送消息

Server向Client say hi:


Client向Server say hello:



3. 断开连接


观察一下断开连接的【四次挥手】:



结合上文 三次握手 的示意图,大概可以理解为:

①Client向Server发消息:觉得我们不合适,不如结束(FIN = 1);

ServerClient发消息:收到你的信息(ACK = 1);

ServerClient发消息收到你的信息(ACK = 1),那我们分手吧(FIN = 1)

Client向Server发消息收到你的信息(ACK = 1)。


原创粉丝点击