博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
TCP协议
阅读量:4977 次
发布时间:2019-06-12

本文共 1477 字,大约阅读时间需要 4 分钟。

  TCP是一个面向连接的协议,在发送数据之前,必须在双方之间建立一条连接。

 

TCP首部

          TCP数据封装在IP数据报中

              TCP包首部

下面简单说明部分字段的作用:

端口号:通讯双方由IP地址和端口号标识。

4位首部长度:表示TCP协议头的长度,以4字节为单位。因此TCP最长协议头是4×15=60字节,如果没有选项字段,TCP协议头最短20字节。

6个标志比特含义:URG:紧急指针有效; ACK:确认序号有效; PSH:接收方应尽快将这个报文段交给应用层; RST:重新连接; SYN:同步序号用来发起一个连接; FIN:发端完成发送任务

窗口大小:提供TCP的流量控制

检验和:由发端计算和存储,由收端进行验证

 

 

通讯时序

          TCP通讯时序图

建立连接过程:

  1. 客户端发出段1,SYN表示连接请求。序号是1000,这个序号在网络通讯中用作临时的地址,每发送一个数据字节,这个序号加1,这样在接收端可以根据序号排出数据包的正确顺序,也可发现丢包的情况,另外规定SYN位和FIN位也必须占一个序号。这次没有发送数据,但是发送了SYN位,因此下次再发送应该用序号1001。mss表示最大段尺寸,如果一个段太大,封装成帧后超过了链路层的最大帧长度,就必须在IP层分片,为避免这种情况,客户端声明自己的最大尺寸,建议服务器发来的段不要超过这个长度。
  2. 服务端发出段2,也带有SYN位,同时置ACK位表示确认,确认序号是1001,表示“我接收到了序号1000及其以前所有的段,请你下次发送序号为1001的段”,也就应答了客户端的连接请求,同时也给客户端发出一个连接请求,同时声明最大尺寸为1024.
  3. 客户端发出段3,对服务器的连接请求进行应答,确认序号是8001。

以上便是建立连接三次握手的具体过程。在TCP通讯中,如果一方接收到对方发来的段,读出其中的目的端口号,发现本机并没有进程使用此端口,就会应答一个包含RST位的段给另一方。

数据传输过程:

  1. 客户端发出段4,包含从序号1001开始的20个字节数据。
  2. 服务器发出段5,确认序号为1021,对序号1001-1020的数据表示确认收到,请求发送序号1021开始的数据。服务器应答的同时也向客户端发送从序号8001开始的10字节数据,这称为piggyback(捎带确认)
  3. 客户端发出段6,对序号8001-8010的数据表示确认收到,请求发送序号8011开始的数据。

在数据传输过程中,ACK和确认序号是非常重要的,应用程序交给TCP协议发送的数据会暂存在TCP层的发送缓冲区中,发出数据包给对方之后,只有收到对方应答的ACK段才知道该数据包确实发送到了对方,可以从发送缓冲区中释放掉了。如果因为网络故障丢失了数据包或者丢失了对方回复的ACK段,经过等待超时后的TCP协议自动将发送缓冲区中的数据包重发。

关闭连接过程:

  1. 客户端发出段7,FIN位表示关闭连接的请求。
  2. 服务器发出段8,应答客户端的关闭连接请求。
  3. 服务器发出段9,也包含FIN位,向客户端发送关闭连接请求。
  4. 客户端发出段10,应答服务器的关闭连接请求。

建立连接是三次握手,关闭连接通常需要4段,服务器的应答和关闭连接请求通常不合并在一个段中,因为有连接半关闭的情况,这种情况下客户端不能发给服务器,但服务器还能发给客户端。

 

 

流量控制

  TCP协议通过“滑动窗口”机制进行流量控制。

 

转载于:https://www.cnblogs.com/chinhao/p/4632682.html

你可能感兴趣的文章
JavaWeb之JSON
查看>>
HOT SUMMER 每天都是不一样,积极的去感受生活 C#关闭IE相应的窗口 .
查看>>
optionMenu-普通菜单使用
查看>>
2016-2017-2点集拓扑作业[本科生上课时]讲解视频
查看>>
【MemSQL Start[c]UP 3.0 - Round 1 C】 Pie Rules
查看>>
Ognl中“%”、“#”、“$”详解
查看>>
我对应用软件——美团的看法
查看>>
struts2.x + Tiles2.x读取多个xml 配置文件
查看>>
表单校验之datatype
查看>>
python第六篇文件处理类型
查看>>
ubuntu16系统磁盘空间/dev/vda1占用满的问题
查看>>
grid网格布局
查看>>
JSP常用标签
查看>>
九涯的第一次
查看>>
处理器管理与进程调度
查看>>
向量非零元素个数_向量范数详解+代码实现
查看>>
java if 用法详解_Java编程中的条件判断之if语句的用法详解
查看>>
matlab sin函数 fft,matlab的fft函数的使用教程
查看>>
mysql adddate()函数
查看>>
mysql sin() 函数
查看>>