一、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. Java Jar 包加密 -- XJar

    Java Jar 包加密 一.缘由 Java的 Jar包中的.class文件可以通过反汇编得到源码.这样一款应用的安全性就很难得到保证,别人只要得到你的应用,不需花费什么力气,就可以得到源码. 这时候 ...

  2. spring cloud config 配置文件更新

    Spring Cloud Config Server 作为配置中心服务端 拉取配置时更新 git 仓库副本,保证是最新结果 支持数据结构丰富,yml, json, properties 等 配合 eu ...

  3. android中使用https是否对服务证书合法性校验的新的体会

    package com.cetcs.logreport.utils; import android.content.Context; import org.apache.http.conn.ssl.S ...

  4. JavaScript基础对象创建模式之单体/单例模式(Singleton)

    首先,单例模式是对象的创建模式之一,此外还包括工厂模式.单例模式的三个特点: 1,该类只有一个实例 2,该类自行创建该实例(在该类内部创建自身的实例对象) 3,向整个系统公开这个实例接口 Java中大 ...

  5. SharePoint删除图片库文件

    SPSecurity.RunWithElevatedPrivileges(delegate() { using (SPSite site = new SPSite(SPContext.Current. ...

  6. C++ 自动资源释放的单例模式

    代码思想就是程序结束时会自动释放静态/全局资源时删除单例资源. //.h class CSingleton { public: static CSingleton* Singleton() { ret ...

  7. Python3笔记009 - 2.6 输入和输出

    第2章 python语言基础 python语法特点 保留字与标识符 变量 数据类型 运算符 输入和输出 2.6 输入和输出 1.input()函数 name = input("请输入姓名:& ...

  8. 阿里云Linux CentOS8.1 64位服务器安装LNMP(Linux+Nginx+MySQL+PHP) 并发调试之MySQL配置

    mysql高并发配置 要在mysqld下设置 1. 修改back_log参数值:由默认的50修改为500.(每个连接256kb,占用:125M) back_log=500 back_log值指出MyS ...

  9. P1330 封锁阳光大学——深度优先搜索DFS

    P1330 封锁阳光大学 题目描述 曹是一只爱刷街的老曹,暑假期间,他每天都欢快地在阳光大学的校园里刷街.河蟹看到欢快的曹,感到不爽.河蟹决定封锁阳光大学,不让曹刷街. 阳光大学的校园是一张由 \(n ...

  10. 准备开始了解orchardcore,有兴趣的一起啊

    orchardcore网上的资料真是少,开始看源码,目前遇到的最大问题是不知道ModuleName属性如何自动注入到OrchardCore.Cms.Web的程序集Assembly上面,等这个搞通了估计 ...