随意谈谈tcp
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的更多相关文章
- 谈谈 TCP 的 TIME_WAIT
由来 最近有同事在用 ab 进行服务压测,到 QPS 瓶颈后怀疑是起压机的问题,来跟我借测试机,于是我就趁机分析了一波起压机可能成为压测瓶颈的可能,除了网络 I/O.机器性能外,还考虑到了网络协议的问 ...
- 谈谈TCP中的TIME_WAIT
所以,本文也来凑个热闹,来谈谈TIME_WAIT. 为什么要有TIME_WAIT? TIME_WAIT是TCP主动关闭连接一方的一个状态,TCP断开连接的时序图如下: 当主动断开连接的一方(Initi ...
- 谈谈TCP的四次挥手
“挥手”是为了终止连接,TCP四次挥手的流程图如下: (在socket编程中,可以由客户端或服务端进行close操作来进行) 下面的图是由客户端主动关闭连接 MSL是什么?最长报文段寿命 ------ ...
- 简单谈谈 TCP/IP
1.前言 IP 或 ICMP.TCP 或 UDP.TELNET 或 FTP.以及 HTTP 等都属于 TCP/IP 协议. 他们与 TCP 或 IP 的关系紧密,是互联网必不可少的组成部分.TCP/I ...
- 面向报文(UDP)和面向字节流(TCP)的区别
转载:http://blog.csdn.net/wanghaobo920/article/details/11877589 面向报文(UDP)和面向字节流(TCP)的区别 面向报文的传输方式是应用层交 ...
- <摘录>详谈高性能TCP服务器的开发
对于开发一款高性能服务器程序,广大服务器开发人员在一直为之奋斗和努力.其中一个影响服务器的重要瓶颈就是服务器的网络处理模块.如果一款服务器程序不能及时的处理用户的数据.则服务器的上层业务逻辑再高效也是 ...
- TCP连接之报文首部
在面试时,会经常被问到TCP报文的一些细节,可以说TCP报文是不少企业用来考察面试者对网络的掌握程度的一道题目. TCP连接作为网络传输的一个环节,是不可或缺的一部分.例如,OSI七层模型的应用层HT ...
- Python web编程 初识TCP UDP
Python网络编程之初识TCP,UDP 这篇文章是读了<Python核心编程>第三版(Core Python Applications)的第二章网络编程后的自我总结. 如果有不到位或者错 ...
- TCP连接关闭总结
由于涉及面太广,只作简单整理,有兴趣的可参考<UNIX Networking Programming>volum 1, Section 5.7, 5.12, 5.14, 5.15, 6.6 ...
随机推荐
- js 正则表达式 取反
http://www.w3school.com.cn/jsref/jsref_obj_regexp.asp 以匹配中文为例 const test_value = '李钊鸿' if (/[^\u4e00 ...
- Android SDK环境搭建
方法有二 方法一: Android SDK开发包国内下载地址 http://www.cnblogs.com/bjzhanghao/archive/2012/11/14/android-platform ...
- CentOS: Make Command not Found and linux xinetd 服务不能启动
在centos 安装编译器 yum -y install gcc automake autoconf libtool make linux xinetd 服务不能启动: [root@capaa xin ...
- MapReduce中的排序(附代码)
在直接学习hadoop的排序之前还要了解一些基本知识. Hadoop的序列化和比较接口 Hadoop的序列化格式:Writable Writable是Hadoop自己的序列化格式,还要一个子接口是Wr ...
- 《Lucene in Action 第二版》第三章节的学习总结----IndexSearcher以及Term和QueryParser
本章节告诉我们怎么用搜索.通过这章节的学习,虽然搜索的内部原理不清楚,但是至少应该学会简单的编写搜索程序了本章节,需要掌握如下几个主要API1.IndexSearcher类:搜索索引的门户,发起者. ...
- GDB + gdbserver 远程调试mediaserver进程
远程调试步骤 在Android设备上启动gdbserver并attach你想调试的进程,并指定监听调试命令的端口(此端口是TV上的端口) $ adb shell # ps |grep media # ...
- 数仓interview总结
一 数据库 1.1 数据库事务特性ACID 原子性Atomicity,一致性Consistency,隔离性Isolation,持续性Durability 1.2 锁有几种,及范围 从数据库系统角度分为 ...
- 创建一个动态Web项目:
开始你的Eclipse,然后进入“文件”>“新建”>“动态Web项目,然后输入项目名称为HelloWorldStruts2和设置其他的选项,在下面的屏幕: 选择在屏幕上的所有默认选项,最后 ...
- 验证-- email类型输入框(电子邮件地址)--multiple
如果需要一个用来填写电子邮件地址的输入框,可以使用email类型.这样浏览器可以帮我们验证格式是否正确,而不需要自己写验证规则.原文:HTML5新控件 - email类型输入框(电子邮件地址) 1,只 ...
- web安全之SQL注入---第四章 如何进行SQL注入攻击
第四章 如何进行SQL注入攻击1.数字注入2.字符串注入 '# '--