第五节 面向连接传输: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. Angular之Providers (Value, Factory, Service and Constant )

    官方文档Providers Each web application you build is composed of objects that collaborate to get stuff do ...

  2. hadoop集群免密码登陆

    今天用openstack的dashboard创建了5个instance,现在的工作就是让它们可以相互访问. 1个namenode,4个datanode. 总体思路:有namenode产生公钥和密钥,传 ...

  3. 通过mvn archetype:generate创建Maven项目模板慢的问题

    通过mvn archetype:generate这种交互方式来创建Maven项目模板的时候,经常会长时间卡在Generating project in Interactive mode这一行提示(图1 ...

  4. ubuntu 10.4非法关机后上不了网

    用的好好的ubuntu 10.4,非法关机后居然上不了网,右上角的网络图标也不见了,还以为是网卡问题,进入xp,发现一切正常,心里不断地诅咒ubuntu,该死的ubuntu,我windows还天天非法 ...

  5. STS中Maven配置

    最近接触maven, 配置过程中记录一下. STS是解压版的,启动后,可以看到已经有了Maven插件, , 但是,STS也同时给你了一个Maven,但是通常不建议使用STS自带的maven.使用默认的 ...

  6. CentOS正确关机方法

    1关机前准备 1.1观察系统使用状态 ·         谁在线:who ·         联网状态:netstat -a ·         后台执行的程序:ps -aux 1.2通知在线使用者关 ...

  7. 利用yield关键字输出杨辉三角

    最近学习了下python,发现里面也有yield的用法,本来对C#里的yield不甚了解,但是通过学习python,对于C#的yield理解更深了!! 不多说了,小学生水平的表达能力伤不起.... 直 ...

  8. CSS 背景 background 讲解

    背景语法:background: background-color || background-image || background-repeat || background-attachment ...

  9. MvcPager

    站点网址:http://www.webdiyer.com/mvcpager/ 控制台命令:Install-Package Webdiyer.MvcPager

  10. C# using

    我们知道 using 语句只不过是提供能确保正确使用 IDisposable 对象的方便语法. 1: using (IDisposable reader1 = new StreamReader(inp ...