S6 传输层:TCP协议
一、TCP特点
面向连接
可靠传输:无差错、不丢失、不重复、按顺序
点对点:TCP连接的两端都设有发送缓存和接收缓存
全双工
二、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. 四次挥手
四、其他
1. 超时重传与连续ARQ协议
2. 流量控制和拥塞控制
S6作业 尝试抓取一TCP数据报,并解读其内容
STEP 01
需要下载从github下载代码,是基于TCP的聊天小程序,分为server(服务端)和client(客户端):
$cd Desktop
$git clone https://github.com/shiyanlou/tcp_ip_6
$cd tcp_ip_6
$gcc -o server server.c
$gcc -o client client.c
STEP 02
编译完成后先不要运行,先打开tcpdump,使用命令安装并运行tcpdump:
$sudo apt-get update
$sudo apt-get install tcpdump
$sudo 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
现在,使用client和server聊天,轮流互发几条简短的消息(比如hello、hi之类的)便可以关闭client和server,回到运行tcpdump的终端查看抓取的报文段内容:
1. server与client建立连接
观察一下建立连接的【三次握手】
2. 相互发送消息
3. 断开连接
观察一下断开连接的【四次挥手】
说明1:
图片来源:实验楼
说明2:
黄色为TCP报文头部
紫色为TCP报文段的数据部分
黑色圈为非常重要的部分,包括:数据偏移、保留位和六个控制位