第五节 面向连接传输: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. 关于PC端与手机端随着手指移动图片位置放生变化的拖拽事件

    当按下鼠标时,图片随鼠标移动松开时图片回到原位 drag("div_id") function drag(node_id){ var node = document.getElem ...

  2. IE8下 Select文字垂直居中的办法

    .select { padding: 4px 0; height: 30px; line-height: 26px; vertical-align: middle;} 处理前: 处理后:

  3. SQLServer性能优化

    http://www.cnblogs.com/studyzy/archive/2008/11/24/1339772.html

  4. PHP Cookei记录用户历史浏览信息的代码

    [基础]Cookie常用方法:$_COOKIE['RecordLuHuiDUDU'] 得到Cookiesetcookie('RecordLuHuiDUDU',",time()-3600*24 ...

  5. TinyXML用法小结

    TinyXML用法小结 1.      介绍 Tinyxml的官方网址:http://www.grinninglizard.com 官方介绍文档:http://www.grinninglizard.c ...

  6. 【原创】Spring MVC项目搭建(使用Java配置)

    一.使用Intellij idea,新建maven项目,选择maven-archetype-webapp. 二.在src/main下新建文件夹,命名为java,并标注为source folder. 三 ...

  7. mybatis笔记(一)

    mybatis (一)传值 三种方式 1.直接传值void getMessageList(int userId,String userName);mapper.xml 获取 #{0}代表userId ...

  8. MarkDown初遇

    MarkDown初遇 纠结盘桓许久,由于那只胖纸,最终决定再次捡起博客这个东东,记录记录生活中.心灵里的点点滴滴. 寻觅的过程中忽然发现MarkDown这个东东,查了查,学习成本不高,简洁而标准,关键 ...

  9. 【转】spring管理属性配置文件properties——使用PropertiesFactoryBean|spring管理属性配置文件properties——使用PropertyPlaceholderConfigurer

     spring管理属性配置文件properties--使用PropertiesFactoryBean 对于属性配置,一般采用的是键值对的形式,如:key=value属性配置文件一般使用的是XXX.pr ...

  10. 使用MyBatis3时 selectOne 方法返回null的问题记录

    不多废话,直接上干货. mapper配置: <resultMap type="User" id="usermap"> <result colu ...