计算机网络--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协议的三次握手和四次分手
通俗理解: 但是为什么一定要进行三次握手来保证连接是双工的呢,一次不行么?两次不行么?我们举一个现实生活中两个人进行语言沟通的例子来模拟三次握手. 引用网上的一些通俗易懂的例子,虽然不太正确,后面会指 ...
随机推荐
- AUC,ROC我看到的最透彻的讲解
版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明. 本文链接:https://blog.csdn.net/u013385925/article/d ...
- C# ffmpeg 视频处理格式转换具体案例
C# ffmpeg 视频处理格式转换 C# ffmpeg 视频处理格式转换avi到MP4格式 1.代码如下: using System;using System.Diagnostics; namesp ...
- SuperWebSocket实现服务端和WebSocket4Net实现客户端
SuperWebSocket实现服务端和WebSocket4Net实现客户端具体实现如下: SuperWebSocket实现服务端 注:本作者是基于vs2019 enterprise版本,所有项目均为 ...
- 用sublime cmd 快速打开hosts文件
:: notepad start subl "%systemdrive%\WINDOWS\system32\drivers\etc\hosts" 文章来源:刘俊涛的博客 ...
- 多层If语句 和 表格驱动 的对比
网文提到表格驱动,总喜欢拿一层if做例子,然而这样未免也太简单. 下文是三层缩进的if和表驱动比较,大家可自行判断优劣. 业务是这样的,某景点分旺季票价和淡季票价,淡季票为旺季的一半,15岁以下孩子再 ...
- 关于如何重写Controller和Service技术攻关文档
版权声明:本文为博主原创文章,遵循CC 4.0 by-sa版权协议,转载请附上原文出处链接和本声明. 本文链接:https://blog.csdn.net/weixin_39784756/articl ...
- Windows安装Redis并添加本地自启动服务并解决客户端dll报错
参考文章:https://blog.csdn.net/realjh/article/details/82026160 Redis下载: https://github.com/MicrosoftArch ...
- System.Net.FtpWebRequest.cs
ylbtech-System.Net.FtpWebRequest.cs 实现文件传输协议(FTP)客户端. 1.返回顶部 1. #region 程序集 System, Version=4.0.0.0, ...
- Summary: curated List of Top 75 LeetCode Questions to Save Your Time
Facebook / Eng tech lead Dec 30, 2018 68 Comments New Year Gift to every fellow time-constrained ...
- typescript类 继承 修饰符
//1.ts中类的定义 /* es5: function Person(name){ this.name=name; this.run=function(){ console.log(this.nam ...