一、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. WeChair项目Beta冲刺(5/10)

    团队项目进行情况 1.昨日进展    Beta冲刺第五天 昨日进展: 前后端并行开发,项目按照计划有条不絮进行 2.今日安排 前端:扫码占座功能和预约功能并行开发 后端:扫码占座后端逻辑开发,预约用座 ...

  2. Linux操作篇之配置DNS服务(一)

    一.什么是DN. 域名(Domain Name)又称网域,是由一串用点分隔的名字组成的Internet上某一台计算机或计算机组的名称,用于在数据传输时对计算机的定位标识(有时也指地理位置).它的作用只 ...

  3. 手把手教你使用Python生成图灵智能小伙伴,实现工作助手/闲聊功能

    /1 前言/ 在家闲着,做个小项目,基于Python,实现一个语聊小机器人,分享给大家.项目整体比较简单,官方文档介绍的非常详细,可快速上手. /2 目标/ 将图灵机器人放到桌面,实现工作助手/陪聊功 ...

  4. 一条SQL删除重复记录,重复的只保留一条

    情景: 我们的数据库中可能会存在很多因各种原因而重复的记录,我们需要对这些重复的记录进行删除,每组组重复的记录只保留一条就行 例如我们有这么个表:两个框框都是有重复记录的,红框和绿框都只需要留下一条, ...

  5. 源码剖析@contextlib.contextmanager

    示例 @contextlib.contextmanager def result(a): print('before') yield print('after') 外层装饰源码 包装func函数,真实 ...

  6. Elasticsearch从入门到放弃:分词器初印象

    Elasticsearch 系列回来了,先给因为这个系列关注我的同学说声抱歉,拖了这么久才回来,这个系列虽然叫「Elasticsearch 从入门到放弃」,但只有三篇就放弃还是有点过分的,所以还是回来 ...

  7. 创建windows窗口

    from tkinter import * win=Tk()                                       #创建窗口对象 win.title("我的第一个gu ...

  8. jQuery创建表格并实现删除

    利用jQuery创建一个简单的表格,并添加一个简单的删除按钮 <!DOCTYPE html> <html lang="en"> <head> & ...

  9. 【搬砖】/etc/passwd 文件结构

    文件的内容: 每个Linux都会有root账号,以此来说明,从内容上看,每行都使用[:]分隔(注意:每行前面的数字是行号,不是内容),所以一共有七部分内容,分别是: 1. 账号名称:root,用来对应 ...

  10. Netty源码学习系列之5-NioEventLoop的run方法

    前言     NioEventLoop的run方法,是netty中最核心的方法,没有之一.在该方法中,完成了对已注册的channel上来自底层操作系统的socket事件的处理(在服务端时事件包括客户端 ...