计算机网络--TCP协议深入理解
在近期学习计算机网络的过程中,由于知识点过于零散,琐碎,从而学习起来痛苦不堪,此贴只是总结了基于传输层的TCP协议相关的知识细节,并加入一点自己的理解,并无创新,若有理解不当之处,敬请提出,感谢!
首先过一下流水账,在计算机网络中,对于网络传输有七层模型,或者TCP/IP四层模型等等,那么先基于TCP/IP四层模型而言:
1.数据链路层:对0和1进行分组,定义了数据帧,确认主机物理地址,并且传输数据
2.网络层:定义IP地址,确认网络位置,通过IP给MAC寻址,对外网数据包进行路由转发
3.传输层:定义端口,确认主机上进程身份,并且把数据包交给对应的进程(利用socket)
4.应用层:定义数据格式,并且按照格式解读数据
在基于传输层中,有很多协议规定了如何去传,如何去收,比如UDP协议,这是一个基于报文(添加了标记,封装后的数据)的传输层协议,但是由于UDP没有确认机制,第一,发送前并不知道双方是否连接成功,第二,一旦数据包发送,无法知道是否收到,可靠性差,这个时候TCP协议就诞生了,简单的来说就是有确认机制的UDP协议(当然UDP协议中有很多的优势,比如传输速度快,可广播,组播等,在具体应用中二者相辅相成,具体根据实际项目来定)
一、
TCP是一个面向数据流的协议,UDP是一个面向数据报文的协议,这句话我相信老师经常会说,但是并没有具体解释是什么意思(反正我是)
1.TCP
我们先假设有一个蓄水池,可以在里面接水和倒水,但是倒水和接水这两者没有必然的关系,可以倒一次水然后分五次接完;接多少水,水池里就少多少水,倒多少水,水池里就多多少水,但不能超过蓄水池的容积,不然水就会溢出,结合TCP来看,水池就好比内核中的接收缓冲区,倒水就好比发送数据,接水就好比接收数据,好比你通过TCP连接给另一端发送数据,你只调用了一次write,发送了100个字节,但是对方可以分10次收完,每次10个字节;你也可以调用10次write,每次10个字节,但是对方可以一次就收完。但是,你发送的数据量不能大于对方的接收缓存(流量控制),如果你硬是要发送过量数据,则对方的缓存满了就会把多出的数据丢弃。
2.UDP
UDP和TCP不同,发送端调用了几次write,接收端必须用相同次数的read读完。UPD是基于报文的,在接收的时候,每次最多只能读取一个报文,报文和报文是不会合并的,如果缓冲区小于报文长度,则多出的部分会被丢弃。也就说,如果不指定MSG_PEEK标志,每次读取操作将消耗一个报文。
这种的区别是由TCP和UDP的特性所决定的,TCP是面向于连接,也就是说,在连接持续的过程中(连接三次握手,断开四次挥手),socket中收到的数据都是由同一台主机发出的(消息截获什么的不考虑),因此,知道保证数据是有序的到达就行了,至于每次读取多少数据自己看着办。
而UDP是无连接的协议,也就是说,只要知道接收端的IP和端口,且网络是可达的,任何主机都可以向接收端发送数据。这时候,如果一次能读取超过一个报文的数据,则会乱套。比如,主机A向发送了报文P1,主机B发送了报文P2,如果能够读取超过一个报文的数据,那么就会将P1和P2的数据合并在了一起,这样的数据是没有意义的。
二、
1.TCP的发送缓冲区和接收缓冲区
TCP协议的传输的端对端,一对一的,那么就会有发送端和接收端,在操作系统有两个空间即user space和kernal space。每个Tcp socket连接在内核中都有一个发送缓冲区和接收缓冲区,TCP的全双工(是指交换机在发送数据的同时也能够接收数据,两者同步进行,这好像我们平时打电话一样,说话的同时也能够听到对方的声音)的工作模式以及TCP的流量(拥塞)控制便是依赖于这两个独立的buffer以及buffer的填充状态。在编程中,一个socket的两端都会由send和recv两个函数,比如Client发送数据到server,那么就是客户端调用send发送数据,但是Send函数的实际作用只是把数据拷贝到socket的内核发送缓冲区中,然后send函数就会返回,send函数仅仅是把应用层buffer的数据拷贝到socket的内核发送buffer中,发送都是纯由TCP来做,和send没有关系(不要被Send的名字给蒙骗了),接下来数据发送到服务器端后,等待recv()进行读取,大家能够猜到了吧,recv函数也仅仅是把socket内核中的接收缓冲区中的数据拷贝到应用层的buffer里而已,如果应用程序一直没有调用recv()进行读取的话,此数据就会一直在相应socket的接收缓冲区内。对于TCP,如果应用进程一直没有读取,接收缓冲区满了之后,发生的动作是:收端通知发端,接收窗口关闭(win=0)。这个便是滑动窗口的实现。保证TCP套接口接收缓冲区不会溢出,从而保证了TCP是可靠传输。因为对方不允许发出超过所通告窗口大小的数据。 这就是TCP的流量控制,如果对方无视窗口大小而发出了超过窗口大小的数据,则接收方TCP将丢弃它。
2.TCP的流量控制机制
根据上面来看,TCP的流量控制机制是通过滑动窗口进行实现的,大致原理图如下,更多的细节可以参考TCP/IP详解这本书,

ACK:表示回复 SYN:请求连接 win:表示可用窗口
未完待续。。。
计算机网络--TCP协议深入理解的更多相关文章
- Http协议与TCP协议简单理解(转)
在C#编写代码,很多时候会遇到Http协议或者TCP协议,这里做一个简单的理解.TCP协议对应于传输层,而HTTP协议对应于应用层,从本质上来说,二者没有可比性.Http协议是建立在TCP协议基础之上 ...
- Http协议与TCP协议简单理解
TCP协议对应于传输层,而HTTP协议对应于应用层,从本质上来说,二者没有可比性.Http协议是建立在TCP协议基础之上的,当浏览器需要从服务器获取网页数据的时候,会发出一次Http请求.Http会通 ...
- 【转载】Http协议与TCP协议简单理解
在C#编写代码,很多时候会遇到Http协议或者TCP协议,这里做一个简单的理解.TCP协议对应于传输层,而HTTP协议对应于应用层,从本质上来说,二者没有可比性.Http协议是建立在TCP协议基础之上 ...
- 【转载】Http协议与TCP协议简单理解后续
写了这么长时间的代码,发现自己对TCP/IP了解的并不是很透彻.虽然会用C#的HttpClient类来进行网络编程,也可以使用Chrome的开发者工具来检测每一次的HTTP请求的报文头与报文体,也知道 ...
- TCP协议理解
一.前言: TCP协议和UDP协议是网络编程里最重要的协议,很多新出的技术.新出的协议本质上都是基于这两个协议的,其中又以TCP协议居多:比如HTTP协议就是基于TCP协议的,应用程序和数据库交互也是 ...
- TCP协议设计原理
TCP协议设计原理 最近去了解TCP协议,发现这是一个特别值得深思的协议.在本篇博客中,不会长篇大论的给大家介绍TCP协议特点.包头格式以及TCP的连接和断开等基本原理,而是会带大家深入理解为什么要这 ...
- TCP协议的学习
1.关于TCP理解的重点(TCP协议可以理解为就是一段代码) (1).TCP协议工作在传输层,对上服务socket接口,对下调用IP层 (2).TCP协议面向连接,通信前必须先3次握手建立连接关系后才 ...
- 通俗大白话来理解TCP协议的三次握手和四次断开
from : https://blog.csdn.net/Neo233/article/details/72866230?locationNum=15&fps=1%20HTTP%E6%8F%A ...
- 通俗大白话来理解TCP协议的三次握手和四次分手
通俗理解: 但是为什么一定要进行三次握手来保证连接是双工的呢,一次不行么?两次不行么?我们举一个现实生活中两个人进行语言沟通的例子来模拟三次握手. 引用网上的一些通俗易懂的例子,虽然不太正确,后面会指 ...
随机推荐
- C语言JSON序列化/反序列化
最近想找一个C语言处理嵌套结构体和结构体数组的json库,理想的是能够很容易处理复杂结构体嵌套,并且使用简单的,但是没找到比较合适的,于是打算自己封装一个: 两个问题: C语言结构体本身没有元数据,这 ...
- Sequence contains no elements
这个错误,在使用List<T>的First函数遇到. Sequence contains no elements? From "Fixing LINQ Error: Sequen ...
- scrapy 爬虫教程
http://python.jobbole.com/87284/ 这篇教程不错,后面的参考链接很好 另外,注意xpath的坑,用chrome的网页调试工具会对xpath会自动优化,自己加上tbody, ...
- 宝塔php open_basedir restriction in effect
解决方法一: 1.网站管理的 防跨站攻击去掉勾选,重启网站,清除浏览器缓存 解决方法二:
- MiniUI官方表单验证示例
原文地址:http://www.miniui.com/docs/tutorial/validator.html 表单验证 参考示例: 验证规则 表单验证 表单验证:文本提示 表 ...
- Android WebServer相关项目
1.AndServer AndServer是Android平台的Web Server和Web Framework. 它基于编译时注解提供了类似SpringMVC的注解和功能,如果您熟悉SpringMV ...
- IDEA优化配置,提高启动和运行速度
IDEA优化配置,提高启动和运行速度 参考链接:https://blog.csdn.net/riju4713/article/details/83217013,http://www.pc0359. ...
- openresty开发系列2--nginx的简单安装,正向、反向代理及常用命令和信号控制介绍
openresty开发系列2--nginx的简单安装,正向.反向代理及常用命令和信号控制介绍 一.nginx的安装下载及编译安装1.Nginx下载:nginx-1.13.0.tar.gz,下载到:/u ...
- 为什么static成员必须在类外初始化,而不能在类的头文件中初始化
为什么static成员必须在类外初始化 为什么静态成员不能在类内初始化 在C++中,类的静态成员(static member)必须在类内声明,在类外初始化,像下面这样. class A { pri ...
- 【439】Tweets processing by Python
参数说明: coordinates:Represents the geographic location of this Tweet as reported by the user or cl ...