TCP协议学习笔记
TCP协议数据格式
TCP协议在互联网ISO协议的传输层。
在互联网传输过程中,互联网包在数据链路层,是传输数据的最基础的包。一个互联网的包包含IP包,即互联网包 = 互联网信息包头(至少20字节)+IP包(1480字节) = 数据包1500字节
IP包是跨局域网传输需要路由的包,是处于网络层的包。一个IP包包含一个TCP或UDP的包,即IP包 = IP包头(至少20个字节)+TCP包(1460字节)= 数据包1480字节
TCP包是传输到指定端口的包,每个端口都表示不同的应用协议服务,TCP协议指定了端口,才能解析数据内容,例如http协议就是8080端口解析的。TCP包处于传输层。一个TCP包 =
TCP包头(至少20字节)+HTTP包(1440字节) = 1460字节。
所以一个TCP包的信息内容在1400字节左右,如果TCP的内容数据是1500字节,发送方就需要发送两个TCP包。HTTP协议因此缩短了HTTP包头,让一个HTTP包只需要一个TCP包传输。
例如一个10M的信息,需要发送7489个数据包。
TCP包的包头信息
TCP协议为了保证数据包之间按照顺序发送,每个TCP包都有一个编号,如上10M的信息需要的包里有1-7489的编号。
每一个TCP包头,传递的信息有三个。
一是编号,表示TCP当前的包所在的顺序,也是唯一标识。
二是发送方需要的下一个数据包的编号,表示接收方回复的TCP数据包中的编号是发送方请求的下一个数据包的编号。所以,在接受方丢失了这个包后,发送给对方的请求编号
便不是发送方请求的包编号。
例如 A 端------------------------------------TCP(id =1 ,ack = 100,length = 100kb)-----------------------------------------------》 B端 ACK = 1
A 端------------------------------------TCP(id =101 ,ack = 200, length = 50kb)---------------------------------------------》(包丢失) B端 ACK = 101
A 端------------------------------------TCP(id =151, ack = 300,length = 100kb)---------------------------------------------》 B端 ACK = 101
A 端的发送窗口=3,即一次性发送3个数据包,第二个数据没有收到,所以B端的ACK不会改变。所以TCP的A端会收到相同的ACK 请求。
A 端 《---------------------------------TCP(id = 100,ack = 101, length = 100kb)-------------------------------------------- B端
A 端 《---------------------------------TCP(id = 300,ack = 101, length = 100kb)-------------------------------------------- B端
这样A端会堆积很多重复的ACK,当ACK重复三次后,A端会重新发送丢失的包。
A 端------------------------------------TCP(id =101 , ack = 200, length = 50kb)---------------------------------------------》 B端 ACK = 151
A 端------------------------------------TCP(id =151 , ack = 300,length = 100kb)---------------------------------------------》 B端 ACK = 251
因此,TCP可以保证包不会丢失。
TCP的传输过程
举一个例子:
A 端 ------------------------------------TCP(id =1 ,ack = 101,length = 100kb)-----------------------------------------------》 B端 ACK = 1
A 端 《---------------------------------TCP(id = 101,ack = 101, length = 100kb)------------------------------------------------ B端
A 端 ------------------------------------TCP(id =101 ,ack = 201, length = 50kb)-----------------------------------------------》 B端 ACK = 101
A 端 《---------------------------------TCP(id = 201,ack = 151, length = 100kb)------------------------------------------------- B端
A 端 ------------------------------------TCP(id =151, ack = 301,length = 100kb)---------------------------------------------》 B端 ACK = 101
A 端 《---------------------------------TCP(id = 301,ack = 251, length = 100kb)-------------------------------------------------- B端
第一条数据包 A端发送给B端的数据编号为1,长度是100字节,第二条数据B端回复A端发送101编号的数据,因此第三A端发送的数据是101开头,且50字节的编号,
第四条数据包 B端再次请求A端给我后续151开头的数据。第五条数据包中A端果然发送给151开头大小为100字节的数据了。最后B端ACK请求251开头的数据。
ACK是什么
在LINUX中,每当发送方发送10个数据包后,会停下来等待接收方的确认。一般接收方每接到2个数据包会发送一个确认消息 Acknowledgment 即为ACK,是确认的意思。
ACK里面包含两个消息:
一是期待接收下一个数据包的编号。
二是接收方的接收窗口的剩余容量。
当发送方获取到这两个信息后,就会知道下一个发送的数据以及发送的数据包的大小,即发送速率。
例如
Client ----------------Segment(seqNum = 300,length = 100)--------------->Server
Client <--------------Acknowledgment(Acknum = 401,Window=60)------>Server
Client ----------------Segment(seqNum = 401,length = 60)--------------->Server
Client <--------------Acknowledgment(Acknum = 461,Window=80)------>Server
Client ----------------Segment(seqNum = 541,length = 100)--------------->Server
Client <--------------Acknowledgment(Acknum = 641,Window=60)------>Server
因为TCP通信是双方的,所以ACK数据是双方都发送的,所以双方的发送窗口大小不同。而且ACK的字段很小,通常和数据包合并在一起发送。
慢启动
在网络传输过程中,最理想的情况当然是传的越快越好,最好一次性发出去。但是网络的情况不稳定,有可能出现低带宽、路由过热、内存溢出的情况,导致丢包。
线路不好的情况下,发的越快,丢的越多。
所以最理想的情况是在线路允许的情况下,达到最高速率。
但是我们如何知道在什么情况下才是理想的速率呢?答案是慢慢试。
TCP协议为了做到效率和可靠性的统一,设计了一个慢启动的机制。
开始的时候,发送的慢,然后根据丢包的概率,调整速率:如果不丢包,就加快发送速率,如果丢包,就降低发送速率.
一般最开始时一次性发送10个数据包.即发送窗口 = 10.
通过ACK机制发现丢包率,进而实现慢启动机制的设计.
TCP数据包的组装
TCP的数据包传输到接收方后,组装还是由原装操作系统完成的.对于应用程序而言,不关心实现网络通信的细节.除非线路异常,收到的数据总是完整的.
应用程序需要的数据放在TCP数据包里,有自己完整的格式.
TCP并没有完整的协议来标识数据的大小,这由应用层的协议来规定,例如HTTP协议就有一个头信息Content-Length,表示信息体的大小.对于操作系统来说,
就是持续的组装数据包,按照顺序排列好,一个包都不能少.
操作系统不会去处理TCP包里面的数据,一旦组装好TCP数据包,就把它转交给应用程序,TCP数据包里有一个端口参数,就是用来转交给指定的应用程序的.
系统根据TCP数据包里的端口,将组装好的数据转交给应用程序,应用程序收到组装好的原始数据,以浏览器为例,就会根据HTTP协议里的Content-Length字段
正确读取一段段的数据.
TCP数据包编号(SEQ)
一段数据量很大的数据,需要用许多TCP包,例如一个10M的信息,需要7348个TCP数据包才能传输完.为了确认每一个TCP包传送成功,TCP数据包设计了数据包编号(SEQ),
数据包编号是一串随机数字,作为丢包的唯一标识.
TCP协议学习笔记的更多相关文章
- TCP协议学习笔记(一)首部以及TCP的三次握手连接四次挥手断开
TCP协议是一种面向连接的.可靠的流协议. 流即不间断的数据结构.这样能够保证接收到数据顺序与发送相同.但是犹如数据间没有间隔,因此在TCP通信中,发送端应用可以在自己所要发送的消息中设置一个标示长度 ...
- HTTP协议学习笔记(一)
HTTP协议学习笔记(一) 1.HTTP协议用于客户端和服务端之间的通信 客户端:请求访问文本或图像等资源的一端服务端:提供资源响应的一端 在两台计算机之间使用HTTP协议通信时,在一条通信线路上必定 ...
- HTTP协议学习笔记(四)
HTTP协议学习笔记(四) 与 HTTP 协作的 Web 服务器 一台 Web 服务器可搭建多个独立域名的 Web 网站,也可作为通信路径上的中转服务器提升传输效率. 1.用单台虚拟主机实现多个域名 ...
- HTTP协议学习笔记(三)
HTTP协议学习笔记(三) 1.状态码告知从服务器端返回的请求结果 状态码的职责是当客户端向服务端向服务端发送请求时,描述返回的请求结果.借助状态码,用户可以知道服务端是正常处理了请求,还是出现了错误 ...
- HTTP协议学习笔记(二)
HTTP协议学习笔记(二) 1.HTTP报文 HTTP报文:用于HTTP协议交互的信息.请求报文:请求端(客户端)的HTTP报文叫做请求报文.响应报文:响应端(服务端)的HTTP报文叫做响应报文. H ...
- tcp/ip学习笔记-TCP
tcp/ip学习笔记-TCP 彭会锋 报文发送采用的是tcp_output函数,
- TCP/IP协议学习笔记
计算机网络基础知识复习汇总:计算机网络基础知识复习 HTTP协议的解析:剖析 HTTP 协议 一个系列的解析文章: TCP/IP详解学习笔记(1)-- 概述 TCP/IP详解学习笔记(2)-- 数据链 ...
- 网络协议学习笔记(四)传输层的UDP和TCP
概述 传输层里比较重要的两个协议,一个是 TCP,一个是 UDP.对于不从事底层开发的人员来讲,或者对于开发应用的人来讲,最常用的就是这两个协议.由于面试的时候,这两个协议经常会被放在一起问,因而我在 ...
- 计算机网络:这是一份全面 & 详细 的TCP协议学习指南
原文链接:blog.csdn.net 用这个媒体播放器组件,实时互动时也可共同观看本地视频juejin.im 前言 计算机网络基础 该是程序猿需掌握的知识,但往往会被忽略 今天,我将详细讲解计算机网络 ...
随机推荐
- jmeter压力测试中的疑难杂症
概述 大部分新手在用jmeter做压力测试的时候,对一些性能术语十分模糊,直接导致的后果就是对测试出来的结果数据根本不能理解,更谈不上分析了.今天的文章就着重给大家解释一下压力测试中的一些专有名词 问 ...
- 【Gamma】Scrum Meeting 5
目录 写在前面 进度情况 任务进度表 照片 写在前面 例会时间:6.1 22:45-23:00 例会地点:微信群语音通话 代码进度记录github在这里 临近期末,团队成员课程压力均较大,需要较多时间 ...
- [Gamma阶段]第二次Scrum Meeting
Scrum Meeting博客目录 [Gamma阶段]第二次Scrum Meeting 基本信息 名称 时间 地点 时长 第二次Scrum Meeting 19/05/28 大运村寝室6楼 20min ...
- 剑指offer:表示数值的字符串
题目描述: 请实现一个函数用来判断字符串是否表示数值(包括整数和小数).例如,字符串"+100","5e2","-123","3. ...
- React 版本16.9.0 中配置路由以及路由传参
我的脚手架版本如下: "dependencies": { "antd": "^3.21.4", "jquery": &q ...
- Shell命令行提示定制
/******************************************************************************* * Shell命令行提示定制 * 说明 ...
- Spring注解驱动第三讲--@Filter介绍
上一讲主要针对@ComponentScan注解做了一些说明,本文主要对@Filter的扫描条件,再做一些详细的介绍 1,FilterType.ANNOTATION 按照注解的方式进行扫描.后面clas ...
- 解决Linux系统下面javamelody图片中文乱码问题
从windows系统中,copy了C:\Windows\Fonts\msyh.ttc和msyhbd.ttc 2个文件到 服务器的%JAVA_HOME%\jre\lib\fonts\fallback 目 ...
- golang程序编译时提示“package runtime: unrecognized import path "runtime" (import path does not begin with hostname)”
在编译golang的工程时提示错误的, 提示的错误信息如下: package bytes: unrecognized import path "bytes" (import pat ...
- Java学习-053-JSON工具类演示
日常开发工作,经常遇到使用JSON数据,好久没有写了,今晚抽了三个小时时间写了个JSON工具类,主要包含如下几个方法: 获取JSON字符串所有键路径列表: 获取JSON字符串所有键值列表: JSON数 ...