第五节 面向连接传输: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. angularjs各版本下载

    下载网址:https://code.angularjs.org/1.2.14/

  2. bootstrap如何自定义5等分

    根据bootstrap源码改的1比5的栅格系统 /*5等分媒体查询样式begin*/ .col-xs-1-5,.col-sm-1-5,.col-md-1-5,.col-lg-1-5,.col-xs-4 ...

  3. .net core 单元测试小记

    创建项目,选择.net core的类库(class library) 修改project.json的配置 { "version": "1.0.0-*", &qu ...

  4. C#入门经典中的SelectionFont属性为null

    14.6.2.richtextbox控件: private void buttonbold_click(object sender, eventargs e)        {            ...

  5. iOS开发app自动更新的实现

    #define kStoreAppId @“xxxxxxxxx” // (appid数字串) -(void)checkAppUpdate { NSDictionary *infoDict = [[NS ...

  6. php 类型

    var_dump 打印出类型和值     整型inter用  decimal 表示为 decimal : [1-9][0-9]* | 0   (int) ( (0.1+0.7) * 10 ); 强制类 ...

  7. linux deepin 12.12.1和Windows 7双系统修改默认启动项

    1.打开终端,输入 sudo gedit /etc/default/grub ,然后输入密码.2.在出来的文本编辑器中找到 GRUB_DEFAULT=0 一行,把0改为2(因为我的Windows 7在 ...

  8. Java 反射 Method的invoke回调调用任意方法

    Java 反射 Method的invoke回调调用任意方法 @author ixenos 关键子:Method.Field.invoke方法指针/函数指针.回调函数 invoke回调流程示例 0.由C ...

  9. C++构造与析构

    C++语言构造函数与析构函数需要注意的地方. 构造 考虑以下定义 struct Node { char *name; int value; Node() { name = ]; strcpy(name ...

  10. IOS 类似网易新闻客户端内容滚动菜单跟随居中组件

    需求分析: 1.类似网易新闻客户端页面滚动组件.菜单栏对应菜单项一直居中 2.点击菜单栏可以切换到对应的page 3.滑动页面可以自动切换相应的菜单.并且对应的菜单栏居中显示 4.初始化时可以自定义菜 ...