【计算机网络】-传输层-Internet传输协议-TCP

TCP介绍

在不可靠的互联网上提供一个可靠的端到端字节流
面向连接的、可靠的、端到端的、基于字节流的传输协议

TCP位置

TCP服务模型

应用程序访问TCP服务

通过在收发双方创建套接字来实现的

套接字的地址

用(IP地址,端口号)来表示的

知名端口

1024以下的端口号,如FTP:21,TELNET:23,SMTP:23

每条连接用(套接字1,套接字2)来表示,是点到点的全双工通道

TCP不支持

多播(multicast)和广播(broadcast)

TCP连接是基于字节流的,而非消息流

(a) 按单独IP数据报发送的四个512字节的数据块

(b) 在一次READ调用中传递给应用程序的2048字节的数据

紧急数据

对于应用程序发来的数据,TCP可以立即发送,也可以缓存一段时间以便一次发送更多的数据
为了强迫数据发送,可以使用PUSH标记
对于紧急数据(urgent data),可以使用URGENT标记

序列号

TCP连接上的每个字节都有它自己独有的32位序列号

TCP协议

交换数据形式

发送端和接收段的TCP实体以数据段的形式交换数据
TCP数据段包含一个20字节的头(选项部分另加)和随后的0个或多个数据字节

段的大小要求

每个数据段包括TCP头在内,要适合IP的65515字节净荷大小
每个网络都有一个最大传输单元(MTU),每个数据段必须适合MTU。实践中,MTU通常为1500字节(以太网的净荷大小)

滑动窗口

TCP实体使用滑动窗口协议,确认序号等于接收方希望接收的下一个序号

超时重传

超时重传

TCP数据段的头

源端口和目的端口

用于寻找发送端和接收端应用进程
各占16位

序列号

序列号表示该TCP数据段中的第一个TCP数据字节在从TCP发送端向TCP接收端发送的数据字节流中的位置。TCP用序列号对每个字节进行计数
只有SYN标志置1时序列号字段才有效
占32位,以字节为单位编号

确认号

确认号应当是上次已成功收到数据字节序号加1。只有ACK标志置1时确认号字段才有效
占32位,以字节为单位编号

TCP头长度

给出TCP头部中32位字的数目,即长度单位为32位字,包含可选项域
占4位
6位的保留域

6位的标志位:置1表示有效

URG:紧急指针有效,和紧急指针配合使用,发送紧急数据
ACK:确认号是否有效
PSH:指示接收方应该尽快将这个报文段交给应用层,不做缓存
RST:重置一个已混乱的连接
SYN:用来发起一个连接
FIN:发端完成发送任务后, FIN用于释放连接

窗口大小

  • 用于基于可变滑动窗口的流控,指示发送方从确认号开始可以再发送窗口大小的字节流,窗口大小为字节数
  • 占16位
  • 校验和
    为增加可靠性,对TCP头,TCP数据计算校验和
    占16位

紧急指针

  • 用来指示紧急数据在当前数据段中的位置,是一个相对于当前序列号的字节偏移值。当URG标志置1时紧急指针才有效
  • 占16位
  • 可选项域

TCP连接建立

建立过程(注:LISTEN,ACCEPT,CONNECT等就是伯克利套接字原语)
服务器方执行LISTEN和ACCEPT原语,被动监听
客户方执行CONNECT原语,产生一个SYN为1和ACK为0的TCP段,表示连接请求
服务器方的传输实体接收到这个TCP段后,首先检查是否有服务进程在所请求的端口上监听,若没有,回答RST置位的TCP段
若有服务进程在所请求的端口上监听,该服务进程可以决定是否接受该请求。在接受后,发出一个SYN置1和ACK置1的TCP段表示连接确认,并请求与对方的连接
发起方收到确认后,发出一个SYN置0和ACK置1的TCP段表示给对方的连接确认
若两个主机同时试图建立彼此间的连接,则只能建立一条连接

TCP连接释放

在数据传输结束后,通信的双方都可以发出释放连接的请求
释放过程对每个单工连接单独释放
TCP连接释放,释放连接时,发出FIN位置1的TCP段并启动定时器,在收到确认后关闭连接。若无确认并且超时,也关闭连接

TCP连接的管理模型

粗实线:客户的正常路径
粗虚线:服务器的正常路径
细线:不正常的事件
事件/动作:
事件或者是用户发起的系统调用(CONNECT、LISTEN、SEND或CLOSE),或者是一个数据段的到达(SYN、FIN、ACK或RST),或者是两倍最大分组生存期的超时事件。
动作是发送一个控制数据段(SYN、FIN或RST)

TCP传输策略

TCP的窗口管理机制
基于确认和可变窗口大小
窗口大小为0时,正常情况下,发送方不能再发TCP段,但有两个例外,紧急数据可以发送,为防止死锁,发送方可以发送1字节的TCP段,以便让接收方重新声明确认号和窗口大小

策略1:发送方缓存应用程序的数据,等到形成一个比较大的段再发出

策略2:在没有可能进行“捎带”的情况下,接收方延迟(如:延迟500ms)发送确认段和窗口更新

策略3: Nagle算法
若数据是逐个字节地到达发送端,那么发送端就将第一个字符先发送出去,将后面到达的字符都缓存起来
当收到第一个字符的确认后,再将缓冲区中的所有字符(装成)用一个TCP数据段发送出去,同时继续对到达的字符进行缓存
只有在收到确认后才继续发送下一个数据段
如果传递进来的数据足够多,多到可以填充一半窗口或填满一个最大数据段长度时,该算法允许发送一个新的数据段

策略4:使用Clark算法解决傻窗口症状
傻窗口症状

设想这种情况,接收端的缓冲区已满,而接收方的应用程序每次只从缓冲区中读取一个字节时,传输层实体会产生一个一字节的窗口更新段,使得发送方只能发送一个字节
解决办法
限制接收方只有在具备一半的空缓存或最大段长的空缓存时,才产生一个窗口更新段
Nagle算法和Clark针对傻窗口症状的解决方案时相互补充的
发送方不要发送太小的数据段(Nagle)
接收方不要请求太小的数据段(Clark)

TCP的拥塞控制

TCP认为导致网络拥塞的两个潜在因素
接收方接收能力
网络传输能力

TCP处理因接收方接收能力和网络传输能力而采取的措施
发送方维护两个窗口:接收方准许的窗口和拥塞窗口
允许发送的字节数量是这两个窗口的最小值

在TCP中使用窗口的概念

接收方准许的窗口(通知窗口)
接收方根据其能力许诺的窗口值
是来自接收端的流量控制
接收端将此窗口值放在TCP报文的头部中,传送给发送端

慢启动(slow start)算法

连接建立时,发送方将拥塞窗口初始化为该连接允许的最大数据段长(如1KB)
发出一个最大段长的TCP段,若正确确认,拥塞窗口变为两个最大数据段长
发送出2个最大长度的TCP段,若都得到确认,则拥塞窗口再加倍
重复上一步,拥塞窗口一直呈指数增加,直至发生丢包超时事件或拥塞窗口达到接收方窗口大小

因特网的拥塞控制算法


最大的数据段长度为1KB;
初始时阈值为64KB;
图是发生一次超时后,阈值被设置为32KB,拥塞窗口被设置为1KB(对应0号传输)

阈值初始时为64KB,当第一次超时发生时,阈值被设置为当前拥塞窗口的一半;而拥塞窗口初始化为该连接允许的最大数据段长
使用慢启动算法来决定网络的处理能力,当增长到阈值时停止
从这点开始,每次成功的传输都会使拥塞窗口线性增长

有效窗口是发送方和接收方分别认为合适窗口中最小的那个

在未发生拥塞的稳定工作状态下,两个窗口(接收方准许的窗口和拥塞窗口)是一致的

【计算机网络】-传输层-Internet传输协议-TCP的更多相关文章

  1. 【计算机网络】-传输层-Internet传输协议-UDP

    [计算机网络]-传输层-UDP 简介 Internet协议集支持一个无连接的传输协议,该协议称为用户数据报协议(UDP,UserDatagram Protocol) .UDP为应用程序提供了一-种无需 ...

  2. 传输层中的协议 TCP & UDP

    面向连接的TCP协议 “面向连接”就是在正式通信前必须要与对方建立起连接.比如你给别人打电话,必须等线路接通了.对方拿起话筒才能相互通话.TCP(Transmission Control Protoc ...

  3. [19/04/13-星期六] 网络编程_基本概念(关注传输层、数据传输,TCP和UDP)

    一.概念 ▪ 什么是计算机网络? 计算机网络是指将地理位置不同的具有独立功能的多台计算机及其外部设备,通过通信线路连接起来,在网络操作系统, 网络管理软件及网络通信协议的管理和协调下,实现资源共享和信 ...

  4. 实验:传输层:UDP协议 学习笔记

    一.传输层协议 从之前介绍的网络层协议来看,通信的两端是两台主机,IP数据报首部就标明了这两台主机的IP地址.但是从传输层来看,是发送方主机中的一个进程与接收方主机中的一个进程在交换数据,因此,严格地 ...

  5. 传输层:UDP 协议

    一.传输层协议 从之前介绍的网络层协议来看,通信的两端是两台主机,IP 数据报首部就标明了这两台主机的 IP 地址.但是从传输层来看,是发送方主机中的一个进程与接收方主机中的一个进程在交换数据,因此, ...

  6. Linux内核--网络栈实现分析(五)--传输层之UDP协议(上)

    本文分析基于Linux Kernel 1.2.13 原创作品,转载请标明出处http://blog.csdn.net/yming0221/article/details/7532512 更多请看专栏, ...

  7. 计算机网络-传输层(3)TCP协议与拥堵控制

    TCP是因特网传输层的面向连接的可靠的运输协议.   TCP被称为是面向连接的:通信双方在发送数据之前必须建立连接,连接状态只在连接的两端中维护,在沿途节点中并不维护状态. TCP连接包括:两台主机上 ...

  8. 计算机网络之传输层(传输层提供的服务及功能概述、端口、套接字--Socket、无连接UDP和面向连接TCP服务)

    文章转自:https://blog.csdn.net/weixin_43914604/article/details/105451022 学习课程:<2019王道考研计算机网络> 学习目的 ...

  9. 网络协议学习笔记(四)传输层的UDP和TCP

    概述 传输层里比较重要的两个协议,一个是 TCP,一个是 UDP.对于不从事底层开发的人员来讲,或者对于开发应用的人来讲,最常用的就是这两个协议.由于面试的时候,这两个协议经常会被放在一起问,因而我在 ...

随机推荐

  1. elasticsearch _all

    在轻量搜索中,我们介绍了 _all 字段:一个把其它字段值 当作一个大字符串来索引的特殊字段. query_string 查询子句(搜索 ?q=john )在没有指定字段时默认使用 _all 字段._ ...

  2. git 优雅的撤销中间某次提交

    环境git : 2+ 前言最近两天,公司的git合并代码时,出现了严重的问题,浪费很多时间: 现在记录下: 情况是这样的,一个同事自己的本地分支(远程没有),不知怎么的,有了别人开发分支的代码,而他自 ...

  3. Firefox Chrome Http请求插件

    Firefox:HttpRequester Chrome:Advanced Rest Client

  4. JAVA 基础编程练习题48 【程序 48 加密】

    48 [程序 48 加密] 题目:某个公司采用公用电话传递数据,数据是四位的整数,在传递过程中是加密的,加密 规则如下:每位数字都加上 5,然后用和除以 10 的余数代替该数字,再将第一位和第四位交 ...

  5. 申请 Let's Encrypt 通配符 HTTPS 证书

    目录 一.背景知识 1.1.什么是通配符证书 1.2.什么是 Let's Encrypt 二.证书申请(certbot) 2.1.系统确定 2.2.工具安装 2.3.证书申请 2.4.证书查看 2.5 ...

  6. Dart Language samples

    Hello World Every app has a main() function. To display text on the console, you can use the top-lev ...

  7. Vue 组件基础完整示例2

    简介此页面可以直接复制运行,包含以下应用: Vue slot插槽使用Vue v-model使用Vue props使用父子组件数据传递element-ui使用HTML方式注册子组件,可以将子组件数据写在 ...

  8. 使用canal通过mysql复制协议从binlog实现热数据nosql缓存(1)

    binlog: mysql在运行过程中执行的DML(增删改)操作都会以二进制形式记录在binlog中 canal server: canal server作为从数据库(slave)向主数据库发送dum ...

  9. “但行好事 莫问前程 只问耕耘 不问收获 成功不必在我 而功力必不唐捐” 科技袁人·年终盛典——5G是科技时代非常重要的基础设施

    中国的科技实力:用数据对比展示当前中国整体科技实力在国际中的发展水平和未来的发展趋势. 主要分为基础研究和应用研究.其中基础研究通过论文数据进行对比展示,应用研究通过发明专利数据. 又分别结合当今中国 ...

  10. VC程序运行时间测试函数

    VC程序运行时间测试函数 介绍 我们在衡量一个函数运行时间,或者判断一个算法的时间效率,或者在程序中我们需要一个定时器,定时执行一个特定的操作,比如在多媒体中,比如在游戏中等,都会用到时间函数.还比如 ...