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. PHP curl post header

    第三方教程推荐:https://www.cnblogs.com/CHEUNGKAMING/p/5717429.html

  2. void 指针的转换

    不论什么类型的指针都能够显式转换为void类型,且不会丢失数据.例如以下面程序: #include<stdio.h> int main(void) { short a=5; void *p ...

  3. vs 2015 update 3各版本下载地址

    微软在06月27日发布了Visual Studio 2015 Update 3 .在MSDN中微软也提供下载,而且MSDN的Visual Studio 2015 Update 3与官方免费下载的文件是 ...

  4. HTML5 2D平台游戏开发#7Camera

    在庞大的游戏世界中,玩家不能一览地图全貌,而是只能看到其中一部分,并一步步探索,这时就要用到一种技术来显示局部的地图,游戏术语称为摄像机(Camera).下面两张图中的白色矩形框表示了Camera的作 ...

  5. IE浏览器下,输入框最后不显示X

    IE浏览器下,输入框最后不显示X.设置: .login-input::-ms-clear { display: none; } .login-input::-ms-reveal { display: ...

  6. window 杀死已开任务启命令

    1. 查询已开启的端口号 C:\Users\Administrator>netstat -ano | findstr 如果被占用会查询出相关信息,如果没有被占用则不会输出任何信息,查询到已开启信 ...

  7. 【JMeter4.0】之 “jdk1.8、JMeter4.0” 安装与配置以及JMeter永久汉化和更改界面背景、并附加附录:个人学习总结

    目录: 一.首先,需要安装.配置jdk 二.其次,安装.配置JMeter 三.JMeter汉化以及更改界面背景 四.附录:个人学习总结 一.首先,需要安装.配置jdk   返回目录 1.到官网下载1. ...

  8. x264源代码学习1:概述与架构分析

    函数背景色 函数在图中以方框的形式表现出来.不同的背景色标志了该函数不同的作用: 白色背景的函数:不加区分的普通内部函数. 浅红背景的函数:libx264类库的接口函数(API). 粉红色背景函数:滤 ...

  9. WPF 获取控件模板中的控件

    DG是控件名称public T GetVisualChild<T>(DependencyObject parent, Func<T, bool> predicate) wher ...

  10. 安装virtualBox 增强包

    1 在原始操作系统安装. 2 打开USB设置. 3 运行虚拟机中的Linux中,Device->install guest additions 再安装增强包. 4 插入U盘,如果这时可以看到U盘 ...