tcp作为四层中可靠到传输协议,为上层协议提供了字节流的可靠到传输,之所以能做到可靠主要因为以下几点:

1、流与分段:流即字节流,计算机处理程序时一般以字节为单位,如果上层协议接收到到是字节流并且跟发送时候字节流顺序相同那么会非常舒服。但大量的字节流都塞到一个报文中传输会有些问题,网络设备都有自己到最大传输单元,如果报文超过传输单元会被丢弃,所以tcp会将要传输到字节流进行分段传输。

2、应答:每一段都会有一个序号,接收端会将接收到到报文按照序号进行序号加1(可以理解成下一个期望接收的序号)的应答。

3、滑动窗口和流量控制:IP层的报文传输是不保序的,这就导致一个后面tcp的分段可能先到,比如发送端发送 1 2 3 4 5 个分段报文,接收端可能收到的顺序是1 2 5 4 3,这样为了在接收端保序,一个很容易的方法就是按照顺序接收,没按照顺序到来的报文直接丢掉,依靠重传机制,比如上述例子中,接收到收到1 2报文之后,接收到了5,发现没按照顺序,则直接丢掉,然后接收到4也丢掉,然后接收到3,等4到重传接收,然后等5,这样可以达到保序到要求,但是大量到丢报文,重传会导致效率较低。另一个极端到想法就是把不按照顺序来到报文缓存到本地,直到所有到报文都接收到再送给上层协议,但这样做也有一个问题,就是不知道设备上会有多少没按照顺序但报文,这样都缓存在本地的话,根本不知道会用多少内存。所以就有了个折中的办法---滑动窗口,滑动窗口可以理解缓存。超出缓存的才丢掉,缓存内的就放着等收齐了上报。

实际上发送方和接收方都有滑窗,发送方的滑窗可以理解为对发送报文速度的限制,如果只在接收方缓存,而发送方不受限制,将会导致大量报文在缓存外,造成资源浪费。

发送方滑窗:

offered window为整个滑窗的大小,可以分为下面两个部分发送但未接收到应答部分和可用于发送到部分。

接收方滑窗:

接收方的滑窗相对于发送方的滑窗多了一个"Received; ACKed; Not Sent to Proc"的部分,接收方接收到的文本流必须等待进程来读取。如果进程正忙于做别的事情,那么这些文本流即使已经正确接收,还是需要暂时占用接收缓存。另外就是已经接收但未来得及应答但部分和未使用的部分。

现在还有一个问题,发送方的滑动窗口应该设置多大?这个其实是在报文交互过程中由接收方通知的,接收方根据自己接收能力,通知发送方自己期望的窗口大小。这样通过调整窗口的大小也自然的起到了流量控制的目的。

4、丢包重传:每一个分段在接收到收到之后都会进行确认。发送端发送报文之后会启动定时器,如果定时器超时还没收到这段的回复,则认为是丢包,那么会重传。

5、拥塞控制:本质上就是限制自己的行为,发现网络拥堵的时候减少自己发送报文的速度,发现网络不拥堵则多发报文。发送方有自己的拥塞窗口,会根据用塞算法调整这个窗口。

随意谈谈tcp的更多相关文章

  1. 谈谈 TCP 的 TIME_WAIT

    由来 最近有同事在用 ab 进行服务压测,到 QPS 瓶颈后怀疑是起压机的问题,来跟我借测试机,于是我就趁机分析了一波起压机可能成为压测瓶颈的可能,除了网络 I/O.机器性能外,还考虑到了网络协议的问 ...

  2. 谈谈TCP中的TIME_WAIT

    所以,本文也来凑个热闹,来谈谈TIME_WAIT. 为什么要有TIME_WAIT? TIME_WAIT是TCP主动关闭连接一方的一个状态,TCP断开连接的时序图如下: 当主动断开连接的一方(Initi ...

  3. 谈谈TCP的四次挥手

    “挥手”是为了终止连接,TCP四次挥手的流程图如下: (在socket编程中,可以由客户端或服务端进行close操作来进行) 下面的图是由客户端主动关闭连接 MSL是什么?最长报文段寿命 ------ ...

  4. 简单谈谈 TCP/IP

    1.前言 IP 或 ICMP.TCP 或 UDP.TELNET 或 FTP.以及 HTTP 等都属于 TCP/IP 协议. 他们与 TCP 或 IP 的关系紧密,是互联网必不可少的组成部分.TCP/I ...

  5. 面向报文(UDP)和面向字节流(TCP)的区别

    转载:http://blog.csdn.net/wanghaobo920/article/details/11877589 面向报文(UDP)和面向字节流(TCP)的区别 面向报文的传输方式是应用层交 ...

  6. <摘录>详谈高性能TCP服务器的开发

    对于开发一款高性能服务器程序,广大服务器开发人员在一直为之奋斗和努力.其中一个影响服务器的重要瓶颈就是服务器的网络处理模块.如果一款服务器程序不能及时的处理用户的数据.则服务器的上层业务逻辑再高效也是 ...

  7. TCP连接之报文首部

    在面试时,会经常被问到TCP报文的一些细节,可以说TCP报文是不少企业用来考察面试者对网络的掌握程度的一道题目. TCP连接作为网络传输的一个环节,是不可或缺的一部分.例如,OSI七层模型的应用层HT ...

  8. Python web编程 初识TCP UDP

    Python网络编程之初识TCP,UDP 这篇文章是读了<Python核心编程>第三版(Core Python Applications)的第二章网络编程后的自我总结. 如果有不到位或者错 ...

  9. TCP连接关闭总结

    由于涉及面太广,只作简单整理,有兴趣的可参考<UNIX Networking Programming>volum 1, Section 5.7, 5.12, 5.14, 5.15, 6.6 ...

随机推荐

  1. java之JDK动态代理

    © 版权声明:本文为博主原创文章,转载请注明出处 JDK动态代理: JDK动态代理就是在程序运行期间,根据java的反射机制自动的帮我们生成相应的代理类 优势: - 1. 业务类只需要关注业务逻辑本身 ...

  2. ORACLE 12C R2 RAC 安装配置指南

    >> from zhuhaiqing.info ASM磁盘空间最低要求 求12C R2相比前一版本,OCR的磁盘占用需求有了明显增长.为了方便操作,设置如下:External: 1个卷x4 ...

  3. Babel中的stage-0,stage-1,stage-2以及stage-3

    大家知道,将ES6代码编译为ES5时,我们常用到Babel这个编译工具.大家参考一些网上的文章或者官方文档,里面常会建议大家在.babelrc中输入如下代码: { "presets" ...

  4. JavaScript的slice()

    JavaScript slice() 方法 JavaScript Array 对象 定义和用法 slice() 方法可从已有的数组中返回选定的元素. 语法 arrayObject.slice(star ...

  5. org.mockito.exceptions.misusing.MissingMethodInvocationException: when() requires an argument which has to be 'a method call on a mock'

    异常原因: 1.mockito的jar包中缺少方法 2.mock方法的时候,返回的是对象,而对象没有重写equals方法 3.mock的实例方法调用方法错误 解决方法: 1.用powermock中的a ...

  6. eclipse导入svn工程,在文件夹里面不展示svn工程图标

    原因:没有安装subclipse插件 解决方法:在marketplace中搜索插件名字:subclipse,点击安装,或者在instal new software中输入插件名字,安装完成之后,在文件夹 ...

  7. BFS 和 DFS

    DFS用到递归,BFS要用到一个辅助队列 #include "stdafx.h" #include<iostream> #include<vector> # ...

  8. 【WPF学习笔记】之依赖属性

    概述: Windows Presentation Foundation (WPF) 提供了一组服务,这些服务可用于扩展公共语言运行时 (CLR) 属性的功能.这些服务通常统称为 WPF 属性系统.由 ...

  9. ffmpeg保存原始数据PCM YUV

    保存yuv ffmpeg -i video.mp4 -c:v rawvideo -pix_fmt yuv420p out.yuv 保存pcm ffmpeg -i input.flv -f s16le ...

  10. 用Jekyll搭建的Github Pages个人博客实践2

    依稀记得之前访问喵神的博客很有feel 感谢喵神git上的提供的主题Vno-Jekyll. 创建代码仓库(你的用户名).github.io 将主题Vno-Jekyll下载到本地,解压到刚刚的代码仓库目 ...