一、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. [ APUE ] 第三章 文件系统

    1. 文件描述符 打开或创建一个文件时,内核向进程返回一个文件描述符,当读.写一个文件时,用open()或creat()返回的文件描述符标识该文件,将其作为参数传递给write.read. stdin ...

  2. 在采用K8S之前您必须了解的5件事情

    作者简介 Christopher Tozzi,自2008年来以自由职业者的身份对Linux.虚拟化.容器.数据存储及其相关主题进行报道. 时至今日,Kubernetes已然成为风靡一时的容器编排调度工 ...

  3. DDoS压力测试工具t50

    site: https://sourceforge.net/projects/t50/ 例子:t50 192.168.1.1 --flood--protocol T50|TCP|UDP|ICMP--t ...

  4. Python干货整理之数据结构篇

    1 stack的实现 实现接口: init() 用于初始化stack,数据类型为list size() 用于获得stack的大小 push() 用于往栈中添加元素,添加的元素类型可以是int或者lis ...

  5. Django迁移命令无法生成mysql表

    数据库迁移问题:在执行python manage.py makemigrations迁移命令之后,正常输出并生成迁移文件,但执行python manage.py migrate之后显示,No migr ...

  6. Spring Boot2.x 的Druid连接池配置[附带监控]

    父依赖[Spring Boot 2.1.x版本] <parent> <groupId>org.springframework.boot</groupId> < ...

  7. java面试知识迷你版

    java基础JUC.AQSJVM类加载过程mybatisSpringspringboot设计模式数据库redis网络问题认证授权Nginxlinux其他lombok消息队列ES缓存分库分表设计高并发系 ...

  8. JVM源码分析之JVM启动流程

      原创申明:本文由公众号[猿灯塔]原创,转载请说明出处标注 “365篇原创计划”第十四篇. 今天呢!灯塔君跟大家讲: JVM源码分析之JVM启动流程 前言: 执行Java类的main方法,程序就能运 ...

  9. 02.RabbitMQ整合springboot简单使用

    1.添加依赖 <dependency> <groupId>org.springframework.boot</groupId> <artifactId> ...

  10. linux新用户(组)的那些事

    linux新用户(组)的那些事   创建新用户 groupadd bigdata //添加新用户组bigdata useradd -g bigdata es //-g:为用户组添加新用户 passwd ...