第五节 面向连接传输:TCP

 

TCP概述RFCs:793,1122,1323,2018,2581
   点对点:
   一个发送方,一个接收方
   可靠,按序的字节流:
   无“报文边界”,无结构但有顺序
   流水式控制:
   TCP的拥塞和流量控制,设置窗口大小
   发送&接收缓存
   全双工数据传输:
   在同一连接上双向传输
   MSS:maximum segment size(最大段字节数-1500,536,512)
   面向连接:
   握手过程(交换控制信息)在交换数据前初始化收发双方的状态“三次握手”
   流量控制:
   发送方的发送速度不得超过接收方的处理速度
TCP段格式(p80)

TCPseq.#’s和ACKs
   Seq.#’s:
   该数据段第一个字节在(整个报文)字节流中“编号”
   ACKs:
   seq#为预期从对方发来的“下一个”字节的编号
   积累的ACK
   Q:接收方如何接受失序的数据段
   A:TCP没有定义,-由程序设计者决定

TCP:可靠数据传输

   简化的发送方,假设
   单向数据传输
   无流量,拥塞控制
TCP:可靠数据传输
   简化的TCP发送方
   00 sendbase=initial_sequence number
   01 nextseqnum = initial_sequence number
   02
   03 loop (forever) {
   04 switch(event)
   05 event:data received from application above
   06 create TCP segment with sequence number nextseqnum
   07 start timer for segment nextseqnum
   08 pass segment to IP
   09 nextseqnum=nextseqnum + length(data)
   10 event:timer timeout for segment with sequence number y
   11 retransmit segment with sequence number y
   12 compue new timeout interval for segment y
   13 restart timer for sequence number y
   14 event:ACK received, with ACK field value of y
   15 if (y > sendbase) { /* cumulative ACK of all data up to y */
   16 cancel all timers for segments with sequence numbers < y
   17 sendbase = y
   18 }
   19 else { /* a duplicate ACK for already ACKed segment */
   20 increment number of duplicate ACKs received for y
   21 if (number of duplicate ACKS received for y == 3) {
   22 /* TCP fast retransmit */
   23 resend segment with sequence number y
   24 restart timer for segment y
   25 }
   26 } /* end of loop forever */
TCP ACK规则
  
TCP:重传场景

TCP流量控制
   流量控制
   发送端不可发送的太多、太快以至于使得接收端的缓存溢出
   RcvBuffer=接收端的 TCP 缓存大小
   RcvWindow=缓存中空闲的部分

   接收端:显式通知发送端(动态变化中的)自由缓存空间
   RcvWindow TCP数据段的字段
   发送端:需要保存已经发送,unACKed数据可少于最近收到的RcvWindow
TCP连接管理
   TCP收发双方在数据交换开始之前需要建立连接
   初始化TCP变量:
   seq.#s
   缓存,流量控制信息(e.g. RcvWindow)
   客户端:连接的发起者
   Socket clientSocket=new Socket("hostname","port number"); -JAVA
   服务器:接受客户端的连接
   Socket connectionSocket=welcomeSocket.accept();
   (建立连接)三次握手:
   Step1:客户端的end system向服务器发送TCP SYN控制数据段
   定义并初始化seq#
   Step 2:服务器的end system接收SYN,用SYNACK控制数据段回答
   ACKs接收到的SYN
   分配缓存
   定义server-> receiver初始化seq.#
   Step3:客户端的end system向服务器发送ACK
   ACKs接收到的连接承诺
   分配缓存
TCP连接管理(续)
   关闭连接:
   客户端关闭插口:clientSocket.close();
   Step1:客户端发送 TCP FIN 控制段给服务器
   Step2:服务器收到
   FIN,用ACK应答.关闭连接,发送FIN.

TCP 连接管理(续)
   Step3:客户端收到FIN,用ACK进行应答.
   随着对接收到的FIN发送ACK-同时进入“timed wait(计时等待)”
   Step4:服务器,接收ACK.连接关闭.
   注意:稍加修改,即可管理同时发生的多个FINs.

TCP连接管理(续)

第五节 面向连接传输:TCP的更多相关文章

  1. centos Linux系统日常管理2 tcpdump,tshark,selinux,strings命令, iptables ,crontab,TCP,UDP,ICMP,FTP网络知识 第十五节课

    centos  Linux系统日常管理2  tcpdump,tshark,selinux,strings命令, iptables ,crontab,TCP,UDP,ICMP,FTP网络知识 第十五节课 ...

  2. 第三百八十五节,Django+Xadmin打造上线标准的在线教育平台—登录功能实现,回填数据以及错误提示html

    第三百八十五节,Django+Xadmin打造上线标准的在线教育平台—登录功能实现 1,配置登录路由 from django.conf.urls import url, include # 导入dja ...

  3. 第三百一十五节,Django框架,CSRF跨站请求伪造

    第三百一十五节,Django框架,CSRF跨站请求伪造  全局CSRF 如果要启用防止CSRF跨站请求伪造,就需要在中间件开启CSRF #中间件 MIDDLEWARE = [ 'django.midd ...

  4. centos lamp/lnmp阶段复习 以后搬迁discuz论坛不需要重新安装,只需修改配置文件即可 安装wordpress 安装phpmyadmin 定时备份mysql两种方法 第二十五节课

    centos  lamp/lnmp阶段复习 以后搬迁discuz论坛不需要重新安装,只需修改配置文件即可 安装wordpress  安装phpmyadmin  定时备份mysql两种方法  第二十五节 ...

  5. 并发编程概述 委托(delegate) 事件(event) .net core 2.0 event bus 一个简单的基于内存事件总线实现 .net core 基于NPOI 的excel导出类,支持自定义导出哪些字段 基于Ace Admin 的菜单栏实现 第五节:SignalR大杂烩(与MVC融合、全局的几个配置、跨域的应用、C/S程序充当Client和Server)

    并发编程概述   前言 说实话,在我软件开发的头两年几乎不考虑并发编程,请求与响应把业务逻辑尽快完成一个星期的任务能两天完成绝不拖三天(剩下时间各种浪),根本不会考虑性能问题(能接受范围内).但随着工 ...

  6. 第九节: 利用RemoteScheduler实现Sheduler的远程控制 第八节: Quartz.Net五大构件之SimpleThreadPool及其四种配置方案 第六节: 六类Calander处理六种不同的时间场景 第五节: Quartz.Net五大构件之Trigger的四大触发类 第三节: Quartz.Net五大构件之Scheduler(创建、封装、基本方法等)和Job(创建、关联

    第九节: 利用RemoteScheduler实现Sheduler的远程控制   一. RemoteScheduler远程控制 1. 背景: 在A服务器上部署了一个Scheduler,我们想在B服务器上 ...

  7. android内部培训视频_第五节(1)_OA实战之登录界面

    第五节(1):OA实战之登录界面  一.登录界面布局 1.背景图片 2.文本框 3.checkbox 4.按钮 暂未实现点击切换图片效果 <RelativeLayout xmlns:androi ...

  8. 基于Extjs的web表单设计器 第五节——数据库设计

    这里列出表单设计器系列的内容,6.7.8节的内容应该在春节后才有时间出了.因为这周末就请假回老家了,准备我的结婚大事.在此提前祝大家春节快乐! 基于Extjs的web表单设计器 基于Extjs的web ...

  9. JAVA GC之标记 第五节

    JAVA GC之标记  第五节 OK,我们继续昨天最后留下的问题,什么是标记?怎么标记? 第一个问题相信大家都知道,标记就是对一些已死的对象打上记号,方便垃圾收集器的清理. 至于怎么标记,一般有两种方 ...

随机推荐

  1. Shell学习笔记 ——第二天

    1.显示日期 date  |   cal   cal 2010  cal 2 2010 2.改变文件拥有者 chown 3.改变文件权限 chmod 4.显示当前目录 pwd 5.查看文件尾部内容,并 ...

  2. 树莓派+Android Things

    在开始之前 谷歌前不久发布了Android Things面向物联网的系统,用意是想让android开发者用原来开发app的方式开发硬件相关的应用,扩展了android开发的方向和前景,而谷歌的Andr ...

  3. @PostConstruct 和 @PreDestory

    关于在spring  容器初始化 bean 和销毁前所做的操作定义方式有三种: 第一种:通过@PostConstruct 和 @PreDestroy 方法 实现初始化和销毁bean之前进行的操作 第二 ...

  4. SVN-Attempted to lock an already-locked dir错误

    svn更新时,文件夹被锁死. 解决办法: 右键该文件,在team(版本管理)里面执行"清除"操作后,问题解决了.

  5. 谷歌Dremel即时数据分析解决方案

    Hadoop技术已经无处不在.不管是好是坏,Hadoop已经成为大数据的代名词.短短几年间,Hadoop从一种边缘技术成为事实上的标准.看来,不仅现在Hadoop是企业大数据的标准,而且在未来,它的地 ...

  6. 在ashx处理程序中,如果返回json串数据?

    可以通过一下代码: using System.Collections.Generic;using System.Web.Script.Serialization; SortedDictionary&l ...

  7. PHP数据类型转换(字符转数字,数字转字符)

    PHP的数据类型转换属于强制转换,允许转换的PHP数据类型有: (int).(integer):转换成整形 (float).(double).(real):转换成浮点型 (string):转换成字符串 ...

  8. 屏幕居中(DIV/CSS) 的几种方法(转)

    1.利用table特性,在width and height all set 100%的时候,可以把容器嵌套在td内形成绝对居中,此时的被嵌套容器可为绝对或者相对大小.(非标准)注意不能加声明! 如是在 ...

  9. Zeppelin使用spark解释器

    Zeppelin为0.5.6 Zeppelin默认自带本地spark,可以不依赖任何集群,下载bin包,解压安装就可以使用. 使用其他的spark集群在yarn模式下. 配置: vi zeppelin ...

  10. 转delphi中 formclose的事件 action:=cafree form:=nil分别是什么意思?

    转自:http://www.cnblogs.com/jshchg/articles/1929894.html MDI子窗体关闭时用到的(以下摘自Delphi的帮助)caNone  The form i ...