第五节 面向连接传输: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. JavaScript DOM编程艺术-学习笔记(总结一)

    1.1)dom-core方法:(不专属于js,支持dom的任何一种程序设计语言都可以使用它,它们的用途,也不仅限于处理网页,也可以用来处理任何一种标记语言编写处理的文档)  ①getElementBy ...

  2. C++实现中缀表达式转前、后缀

    #include<iostream> #include<string> #include<stack> using namespace std; bool isIn ...

  3. php+mysql 内联接 和 子查询

    INNER JOIN(内连接):取得两个表中存在连接匹配关系的记录 $sql="SELECT * FROM subject as a INNER JOIN e_user as b ON a. ...

  4. jquery学习笔记2——jq效果

    一.显示隐藏: 可以使用show()和hide()方法来显示隐藏: $("#hide").click(function(){ $("p").hide(); }) ...

  5. 【转】HDU1028

    转自博客园ID:2108,老卢同志 http://www.cnblogs.com/--ZHIYUAN/p/6102893.html Ignatius and the Princess III Time ...

  6. Python统计栏目页面数量

    主要为了装个B,统计栏目页面数量时候用的,多线程基本照抄 http://www.cnblogs.com/fnng/p/3670789.html 关于对SEO有什么用处...我觉得...仅对本人有用,P ...

  7. SQL learning

    一.创建和删除数据库 1.创建用户 //创建用户且置密码,在MySQL中行,但在Oracle中行  ----必须在超级管理员身份下操作 create user hncu identified by ' ...

  8. String对象的Replace()

    <!DOCTYPE html> <html> <head> </head> <body> <script type="tex ...

  9. 用block解决nstimer循环引用

    大多数开发者可能都会这样来实现定时器.创建定时器的时候,由于目标对象是self,所以要保留此实例.然而,因为定时器是用实例变量存放的,所以实例也保留了定时器,这就造成了循环引用.除非调用stop方法, ...

  10. Linux启动新进程的几种方法及比较[转]

    有时候,我们需要在自己的程序(进程)中启动另一个程序(进程)来帮助我们完成一些工作,那么我们需要怎么才能在自己的进程中启动其他的进程呢?在Linux中提供了不少的方法来实现这一点,下面就来介绍一个这些 ...