随意谈谈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 ...
随机推荐
- Atitit.Java exe bat 作为windows系统服务程序运行
Atitit.Java exe bat 作为windows系统服务程序运行 1. 使用SC命令+srvany.exe (不错,推荐)+net start1 1.1. First 创建一个java的运 ...
- Django--登录认证
COOKIE 与 SESSION 概念 cookie的使用,不止局限于我们所使用的登录认证,cookie不属于http协议范围,由于http协议无法保持状态,但实际情况,我们却又需要“保持状态”,因此 ...
- Java中的equals方法和自定义比较器
Object中的equals()方法默认是按地址比较,而不按内容进行比较, public boolean equals(Object obj) { return (this == obj); } 在S ...
- JSTL JSP页面推断某个cookie的值和读取值....
<c:if test="${cookie['woshop'].value eq '1'}"> <div> ...
- 使用第三方工具Cornerstone搭建本地SVNserver
一.加入版本号资源库 点击Cornerstone左下角REPOSITORIES栏右边的加号button.在弹出的视图中选择File Repository,然后选择Create a New Reposi ...
- SQL索引及表的页的逻辑顺序与物理顺序
1.经过测试发现当聚集索引新建或者重建时,会按照逻辑顺序重新排列数据页和数据页内的数据行的物理顺序. 2.但修改表时,无论是聚集索引还是堆的数据页都是按自然顺序向后插入数据,页面上的偏移量可以证明.因 ...
- 64位win7环境eclipse集成svn后出现Failed to load JavaHL Library的解决办法
http://lushuifa.iteye.com/blog/2038000
- hiho一下 第115周:网络流一•Ford-Fulkerson算法 (Edmond-Karp,Dinic,SAP)
来看一道最大流模板水题,借这道题来学习一下最大流的几个算法. 分别用Edmond-Karp,Dinic ,SAP来实现最大流算法. 从运行结过来看明显SAP+当前弧优化+gap优化速度最快. hi ...
- Lumen开发:lumen源码解读之初始化(4)——服务提供(ServiceProviders)与路由(Routes)
版权声明:本文为博主原创文章,未经博主允许不得转载. 前面讲了singleton和Middleware,现在来继续讲ServiceProviders和Routes,还是看起始文件bootstrap/a ...
- java 中 集合类相关问题
1,Java中Collection和Collections的差别 java.util.Collection 是一个集合接口.它提供了对集合对象进行基本操作的通用接口方法. Collection接口在J ...