一、TCP协议特点和报文段格式

  1. 面向连接的传输层协议
  2. 每一条TCP连接只能有两个端点
  3. TCP提供可靠交付的服务,无差错,不丢失,不重复,按序到达
  4. 全双工通信 ->

发送缓冲:准备发送的数据&已发送但尚未收到确认的数据

接收缓存:按序到达但尚未被接受应用程序读取的数据&不按序到达的数据

  1. TCP面向字节流

重点(报文段格式)

序号:本报文段发送数据的第一个字节的序号

确认号:期望收到对方下一个报文段的第一个数据字节的序号,若确认号为N,则证明到序号N-1为止都已正确收到

数据偏移(首部长度):TCP报文段的数据起始处距离TCP报文段的起始处有多远,以4B为单位,即1个数值就是4B

窗口:允许对方发送的数据量(自己可以容纳的数据量)

六个字段:

二、TCP连接管路

  1. 连接建立

三次握手

  1. 数据传输
  2. 连接释放

四次握手

三、TCP可靠传输

可靠:接收方进程从缓存区中读出的字节流与发送方发出的字节流是完全一样的

TCP实现可靠传输的机制:

  1. 校验:与UDP校验一致
  2. 序号

  1. 确认

  1. 重传(TCP发送方在规定时间没有收到确认(或者冗余ACK)就要重传)

四、TCP流量控制(让发送方发慢点)

TCP利用滑动窗口实现流量控制

在通信过程中,接收方根据自己接收缓存的大小,动态地调整发送方的发送窗口大小,即接收窗口rwnd(接收方设置确认报文段的窗口字段来将rwnd通知给发送方),发送方的发送窗口取接收窗口rwnd和拥塞窗口cwnd的最小值。

防止僵持(死锁)

五、TCP拥塞控制(防止过多数据注入网络)

出现拥塞的条件:对资源的需求的总和 > 可用资源

与流量控制的区别:

拥塞控制四种算法:

  1. 慢开始
  2. 拥塞避免
  3. 快重传
  4. 快恢复

接收窗口:接收方根据接受缓存设置的值,并告知给发送方,反映接收方容量

拥塞窗口:发送方根据自己估算的网络拥塞程度而设置的窗口值,反映网络当前容量

ssthresh:慢开始门限值

from matplotlib import pyplot as plt
from matplotlib.widgets import Button
from PIL import Image
import numpy as np # matplotlib画图
def draw():
x = []
for i in range(len(cwnd_array)):
x.append(i+1)
axe.plot(x, cwnd_array)
fig.canvas.draw() # dupACKcount++
def dup_ACK(event):
tcpcc.add_dup_ack()
draw()
print('dupACKcount = ', tcpcc.dupACKcount) # timeout
def let_timeout(event):
tcpcc.timeout()
draw() # new ACK
def new_ack(event):
tcpcc.new_ack()
draw() # 画按钮
def draw_button():
global ack_btn, timeout_btn, new_ack_btn # must global
ack_point = plt.axes([0.3, 0.03, 0.1, 0.03])
ack_btn = Button(ack_point, "DUP ACK")
ack_btn.on_clicked(dup_ACK) new_ack_point = plt.axes([0.45, 0.03, 0.1, 0.03])
new_ack_btn = Button(new_ack_point, "NEW ACK")
new_ack_btn.on_clicked(new_ack) timeout_point = plt.axes([0.6, 0.03, 0.1, 0.03])
timeout_btn = Button(timeout_point, "TIMEOUT")
timeout_btn.on_clicked(let_timeout) # TC拥塞控制类
class TCP_C_C:
def __init__(self):
self.cwnd = 1
self.ssthresh = 64
self.dupACKcount = 0
self.state = '慢启动' # 状态分为:慢启动、拥塞避免、快恢复
cwnd_array.append(self.cwnd) # 增加一个ACK重复的
def add_dup_ack(self):
if self.state == '快恢复':
self.cwnd = self.cwnd + 1
else:
self.dupACKcount = self.dupACKcount + 1
if self.dupACKcount == 3:
self.ssthresh = self.cwnd / 2
self.cwnd = self.ssthresh + 3
self.state = '快恢复'
cwnd_array.append(self.cwnd) # 超时
def timeout(self):
self.ssthresh = self.cwnd / 2
self.cwnd = 1
self.dupACKcount = 0
self.state = '慢启动' # 状态分为:慢启动、拥塞避免、快恢复
cwnd_array.append(self.cwnd) # new ACK
def new_ack(self):
if self.state == '慢启动':
self.cwnd = self.cwnd * 2
self.dupACKcount = 0
if self.cwnd >= self.ssthresh:
self.state = '拥塞避免'
elif self.state == '拥塞避免':
self.cwnd = self.cwnd + 1
self.dupACKcount = 0
elif self.state == '快恢复':
self.cwnd = self.ssthresh
self.dupACKcount = 0
self.state = '拥塞避免'
cwnd_array.append(self.cwnd) if __name__ == "__main__":
cwnd_array = [] # 纵坐标
tcpcc = TCP_C_C()
fig = plt.figure()
draw_button()
axe = fig.add_subplot(111)
axe.plot(cwnd_array)
plt.xlabel('Transmission round')
plt.ylabel('cwnd')
plt.grid()
plt.show()

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-mTppw4Aw-1592742727926)(https://uploader.shimo.im/f/PG8K3zzeo7V6A1nN.gif)]

3.TCP协议的更多相关文章

  1. TCP协议学习

    一.TCP参考模型  VS OSI参考模型 二.TCP/IP分层模型的四个协议层分别完成以下的功能 第一层 网络接口层 网络接口层包括用于协作IP数据在已有网络介质上传输的协议.实际上TCP/IP标准 ...

  2. 【转】TCP协议

    TCP是什么? TCP(Transmission Control Protocol 传输控制协议)是一种面向连接(连接导向)的.可靠的. 基于IP的传输层协议.TCP在IP报文的协议号是6.TCP是一 ...

  3. 闲来无事,写个基于TCP协议的Socket通讯Demo

    .Net Socket通讯可以使用Socket类,也可以使用 TcpClient. TcpListener 和 UdpClient类.我这里使用的是Socket类,Tcp协议. 程序很简单,一个命令行 ...

  4. 简单测试nginx1.90做TCP协议负载均衡的功能

    最近工作中需要做TCP层面的负载均衡,以前网站用的反向代理nginx只支持应用层的负载均衡,对于TCP协议是无能为力的,需要使用LVS(linux虚拟服务器). LVS的特点是高性能和极复杂的配置.对 ...

  5. TCP协议

    TCP是一个面向连接的协议,在发送数据之前,必须在双方之间建立一条连接. TCP首部 TCP数据封装在IP数据报中 TCP包首部 下面简单说明部分字段的作用: 端口号:通讯双方由IP地址和端口号标识. ...

  6. TCP协议的三次握手和四次挥手

    暂时需要的信息有: ACK : TCP协议规定,只有ACK=1时有效,也规定连接建立后所有发送的报文的ACK必须为1 SYN(SYNchronization) : 在连接建立时用来同步序号.当SYN= ...

  7. TCP协议三次握手和四次挥手

    http://www.cnblogs.com/rootq/articles/1377355.html TCP(Transmission Control Protocol) 传输控制协议 TCP是主机对 ...

  8. ZeroMQ接口函数之 :zmq_tcp – 使用TCP协议的ØMQ网络单播协议

    ZeroMQ 官方地址 :http://api.zeromq.org/4-1:zmq-tcp zmq_tcp(7)          ØMQ Manual - ØMQ/4.1.0 Name zmq_t ...

  9. C#网络编程之---TCP协议的同步通信(二)

    上一篇学习日记C#网络编程之--TCP协议(一)中以服务端接受客户端的请求连接结尾既然服务端已经与客户端建立了连接,那么沟通通道已经打通,载满数据的小火车就可以彼此传送和接收了.现在让我们来看看数据的 ...

  10. TCP协议学习笔记(一)首部以及TCP的三次握手连接四次挥手断开

    TCP协议是一种面向连接的.可靠的流协议. 流即不间断的数据结构.这样能够保证接收到数据顺序与发送相同.但是犹如数据间没有间隔,因此在TCP通信中,发送端应用可以在自己所要发送的消息中设置一个标示长度 ...

随机推荐

  1. 黎活明8天快速掌握android视频教程--21_监听ContentProvider中数据的变化

    采用ContentProvider除了可以让其他应用访问当前的app的数据之外,还有可以实现当app的数据发送变化的时候,通知注册了数据变化通知的调用者 其他所有的代码都和第20讲的一样,不同的地方看 ...

  2. 黎活明8天快速掌握android视频教程--19_采用ListView实现数据列表显示

    1.首先整个程序也是采用mvc的框架 DbOpenHelper 类 package dB; import android.content.Context; import android.databas ...

  3. java面试基础必备

    一.Java基础 1. String类为什么是final的. 2. HashMap的源码,实现原理,底层结构. 3. 说说你知道的几个Java集合类:list.set.queue.map实现类咯... ...

  4. 入门大数据---HDFS-HA搭建

    一.简述 上一篇了解了Zookeeper和HDFS的一些概念,今天就带大家从头到尾搭建一下,其中遇到的一些坑也顺便记录下. 1.1 搭建的拓扑图如下: 1.2 部署环境:Centos3.1,java1 ...

  5. Linux安装docker笔记

    更新yum操作 yum -y update 安装docker yum install -y docker 或者yum install -y docker-engine 启动docker  servic ...

  6. 线上redis问题修复:JedisConnectionException: Unexpected end of stream.

    经过: 项目上线后经常报 Unexpected end of stream.; nested exception is redis.clients.jedis.exceptions.JedisConn ...

  7. Spring Boot是什么?

    背景 最近因公司需要,开始研究java相关的开发,之前一直从事.net相关开发,所以写的或者理解的不对的地方呢,希望大家批评指正. 首先开发框架吧,就像.net很早之前有asp.net webForm ...

  8. JavaScript基础尽量少使用全局变量(001)

    Pattern意思是模式,好的编码习惯经过多次实践的应用就会形成模式,而反模式(Anti-Pattern)则是不好的编码习惯.了解 JavaScript模式之前,先来看看Anti-pattern的例子 ...

  9. eIQ WSL下工具及环境配置

    1. 配置WSL 参考[https://www.cnblogs.com/hayley111/p/12844337.html] 2. 配置VScode 参考[https://zhuanlan.zhihu ...

  10. 飞越面试官(一)--Java基础

    大家好!我是本公众号唯一官方指定没头屑的小便--怕屁林. 众所周知,现场面试(包括视频面试)多数时候是没有白板,也就是说,对于你的知识点.项目经验.过往经历和个人介绍等等,都是靠一张嘴.所以考虑到这个 ...