计算机网络 part1 TCP
一、TCP协议
references:newcoder
TCP/IP协议,TCP和UDP的区别及特点
1、四层模型
应用层:载有应用程序,将数据发送给传输层。主要协议有HTTP、SMTP、FTP、DNS等。
传输层:负责应用程序间的通信,将来自应用程序的信息流格式化封装。主要协议有TCP、UDP。
网络层:将传输层的信息流打包成IP数据包,交给链路层进行不同主机间的通信。主要协议有IP。
链路层:接收网络层的IP数据包,封装成帧发送到网络;从网络接收物理帧,抽出IP数据包,交给网络层。
2、可靠性
1).序列号、校验和、确认应答、超时重传
每个包都有序列,接收方可以按序号排序;收到数据段,接收方会返回一个相对应的确认字符ACK,ACK一般是我已经收到的序号+1,也就是期望收到下个报文段第一个数据字节的序号;如果发送端在一定时间(这个时间一般是2*RTT(报文段往返时间)+一个偏差值内)未接收到确认应答,那么对应的数据包就会被认为丢失而重传。
- 校验和:
1、校验和字段设为0。
2、把需要校验的数据(TCP首部+TCP数据+TCP伪首部)看成以16位为单位的数字组成,不够的补0。
3、进行2进制反码求和(最高位进时进位到最低位),存入校验和中。
4、校验:把需要校验的内容看成16位为单位的数字,进行2进制反码求和,结果为0则正确。
2).流量控制
滑动窗口: 是接收方建议发送方的窗口大小,防止发送方一次发送太多数据。
如果发送方把数据发送得过快,接收方可能会来不及接收,这就会造成数据的丢失。所谓流量控制就是让发送方的发送速率不要太快,要让接收方来得及接收。
在滑动窗口内的数据包可以直接发送,当窗口左边发送并且收到确认后窗口就会右移。
3).拥塞控制
拥塞窗口: 发送方为了避免出传输路径堵塞所采用的窗口。
窗口大小的设定:
慢启动: 一开始将窗口(CWND)设为1,每次收到确认应答(经过一个RTT),拥塞窗口大小*2;当报文段超时重传时,将阈值(ssthresh)设为当前窗口大小的一半,窗口大小设为1,然后慢启动。
拥塞避免: 设置慢启动阈值, 一般设为65536(2^16)。当拥塞窗口大小到达这个阈值时,不能乘2,而是每次+1;当报文段超时重传时,将阈值设为当前窗口大小的一半,窗口大小设为1,然后慢启动。
快速重传: 3次收到重复ACK,马上重传。比如三次收到1001确认应答,就说明1001开始没收到,重发1001开始的数据段。
快速恢复: 收到3个重复ACK,启动快速重传,并且启动快恢复。将阈值设为当前窗口大小的一半,并将拥塞窗口大小设为新的阈值+3(因为收到3个说明之前发出了3个保温,有些不加3)。接下来每收到一次刚才的重复确认,拥塞窗口+1。当收到新的数据确认ACK时,将窗口大小设为慢启动阈值,然后进入拥塞避免。
3、TCP首部格式(20字节)
- 源端口号:表示发送端端口号,字段长16位,因为端口号有\(2^{16}\)个。
- 目标端口号:表示接收端端口号,字段长度16位。
- 序列号:字段长32位,初始值是个随机值。
- 确认应答号:下一次应收到的序列号。
- 数据偏移:可以认为是TCP首部长度,单位是4字节。例如数据库偏移是7,则首部长度为28字节。
- 窗口大小:字段长16位。
- 控制位:8位。
- 校验和:
1、校验和字段设为0。
2、把需要校验的数据(TCP首部+TCP数据+TCP伪首部)看成以16位为单位的数字组成,不够的补0。
3、进行2进制反码求和(最高位进时进位到最低位),存入校验和中。
4、校验:把需要校验的内容看成16位为单位的数字,进行2进制反码求和,结果为0则正确。
4、三次握手
references:TCP的三次握手与四次挥手理解及面试题(很全面)
基于TCP传输层协议的连接被建立时,发送方和接收方共发送3个包,称为3次握手。
第一次握手:发送端发送一个SYN=1(同步序列编号)和初始序号Seq=X(随机的)。告诉接收方请求建立连接。客户端进入SYN_SENT状态,请求连接,等待确认。
第二次握手:接收端确认发送端的SYN(发送ACK=X+1),同时自己也发送一个SYN=1,Seq=Y(随机的)。说明接收端确认收到建立连接信息。服务器进入SYN_RECV状态。
第三次握手:确认接收方的SYN+ACK包,发送ACK=Y+1,Seq=X+1。此时TCP连接成功。客户端和服务器进入ESTABLISHED状态。
为什么是三次握手?而不是两次四次?
防止已经失效的请求连接报文段突然传到服务端,从而产生错误。
比如,当客户端第一次握手的报文段在网络中因为延迟在某个节点到达服务端,而服务端发出确认应答,同理建立连接。但是客户端此时并没有请求建立连接,那么就会忽视这个确认应答,因为没有第三次握手,那么服务端就会一直等待客户端发送数据。
5、四次挥手
第一次挥手:客户端发送释放连接的报文,FIN=1,Seq=u。请求释放连接。客户端进入FIN_WAIT1(终止等待1)状态。
第二次挥手:服务端收到释放连接的报文,发出确认报文ACK=u+1,并且带上自己的序列号Seq=v。此时,客户端向服务器方向的连接已经断开了,客户端不会继续发送数据。处于半关闭(FIN_WAIT2)状态。但是服务器发送数据,客户端依然要接受。客户端等待服务端的连接释放报文。服务端进入CLOSE_WAIT(关闭等待)状态。客户端收到确认请求后,进入FIN_WAIT2(终止等待2)状态。
第三次挥手:服务器最后数据发送完毕,向客户端发送释放连接的报文,FIN=1,ACK=u+1,Seq=w。等待客户端确认。服务器进入LAST_ACK(最后确认)状态,等待客户端的确认报文。
第四次挥手:客户端收到释放连接报文,发出确认,进入TIME_WAIT状态。ACK=w+1,Seq=u+1。服务端收到确认报文立即关闭TCP连接,立即进入CLOSED状态。客户端发送确认报文后,不马上关闭连接,而是等2∗MSL(最长报文段寿命)后关闭。因为最后的确认报文可能丢失,所以要等待,如果服务端没收到确认报文,服务端会超时重传FIN。所以服务端断开TCP连接比客户端早。最后客户端撤销TCP连接,进入CLOSED状态。
6、同时打开,同时关闭,半打开
references:TCP-IP详解:TCP半打开连接及同时打开同时关闭
同时打开:
两个应用同时主动打开,发送SYN包,进入SYN_SENT状态。他们都收到了对方发送的SYN,然后向对方发送SYN包和ACK包,这时进入SYN_RECV状态。在他们收到对方的SYN和ACK包后,直接建立连接,进入ESTABLISHED状态。
同时关闭:
双方同时主动关闭,发送FIN包进入FIN_WAIT1状态。双方收到对方的FIN后进入CLOSING状态,然后发送ACK确认,进入TIME_WAIT状态。最后CLOSED。
半打开:
一方因异常关闭(断网、断电),而另一方不知情,这时候就处于半打开连接。如果双方不进行数据通信,仍处于连接状态的一方就不会检测另外一方已经出现异常。如果需要发数据的话,这边收到之后 其实发现这个连接并不存在了,就会回复RST包(reset报文)告知,强制关闭连接,这个时候就需要重新建立连接了。
计算机网络 part1 TCP的更多相关文章
- 计算机网络及TCP/IP知识点(全面,慢慢看)
TCP/IP网络知识点总结 一.总述 1.定义:计算机网络是一些互相连接的.自治的计算机的集合.因特网是网络的网络. 2.分类: 根据作用范围分类: 广域网 WAN (Wide Area Networ ...
- 计算机网络 之 TCP协议报文结构
前言:上学期实训课,由于要做一个网络通信的应用,期间遇到各种问题,让我深感计算机网络知识的薄弱.于是上网查找大量的资料,期间偶然发现了roc大神的博客,很喜欢他简明易懂的博文风格.本文受roc的< ...
- 计算机网络要点---TCP
计算机网络要点---TCP 浏览器在通过域名通过dns服务器找到你的服务器外网ip,将http请求发送到你的服务器,在tcp3次握手之后(http下面是tcp/ip),通过tcp协议开始传输数据,你的 ...
- 计算机网络(7)-----TCP协议概述
传输控制协议(Transmission Control Protocol) 概念 一种面向连接的.可靠的.基于字节流的传输层通信协议,由IETF的RFC 793定义.在简化的计算机网络OSI模型中,它 ...
- Day 6-1计算机网络基础&TCP/IP
按照功能不同,人们将互联网协议分为osi七层或tcp/ip五层或tcp/ip四层(我们只需要掌握tcp/ip五层协议即可) 每层运行常见物理设备: TCP/IP协议: Transmission Con ...
- 计算机网络知识—(TCP)
计算机网络在IT行业的重要性 IT即互联网技术,从事的工作和网络有很大的关系,前端要负责和后台(服务器)进行交互,其必然得经过网络,所以懂点网络知识有很大的帮助. 网络模型数据处理过程 传输层协议的作 ...
- 计算机网络:TCP协议建立连接的过程为什么是三次握手而不是两次?【对于网上的两种说法我的思考】
网上关于这个问题吵得很凶,但是仔细看过之后我更偏向认为两种说的是一样的. 首先我们来看看 TCP 协议的三次握手过程 如上图所示: 解释一下里面的英文: 里面起到作用的一些标志位就是TCP报文首部里的 ...
- 初探计算机网络之TCP/IP网络协议
网络协议 在计算机诞生以来,从最原始的单机模式到现在多台计算机协同工作,形成计算机网络,从前很难想象的信息共享.多机合作.大规模计算在今天也早已成了现实.在早期,计算机网络需要解决的痛点,就是怎样 ...
- 计算机网络(11)-----TCP连接的建立和释放
TCP连接的建立和释放 概述 TCP运输连接的建立和释放是每一次面向连接的通信中必不可少的过程,运输连接有三个阶段:连接建立,数据传送和连接释放. TCP连接的建立 如图所示,假定A主机是客户端程序, ...
随机推荐
- 命令模式与go-redis command设计
目录 一.什么是命令(Command)模式 二.go-redis command相关代码 三.总结 一.什么是命令(Command)模式 命令模式是行为型设计模式的一种,其目的是将一个请求封装为一个对 ...
- 被集群节点负载不均所困扰?TKE 重磅推出全链路调度解决方案
引言 在 K8s 集群运营过程中,常常会被节点 CPU 和内存的高使用率所困扰,既影响了节点上 Pod 的稳定运行,也会增加节点故障的几率.为了应对集群节点高负载的问题,平衡各个节点之间的资源使用率, ...
- MYSQL基础知识的复习2
1.修改表中的数据 update 表名 set 要修改的字段 where 条件;-- 如果修改多个字段那么字段和字段之间用逗号隔开 2.查询(很重要) 1.查询表中部分字段: select 字段名,字 ...
- Android iText向pdf模板插入数据和图片
一.需求 这些日志在写App程序,有这么一个需求,就是需要生成格式统一的一个pdf文件,并向固定表格中填充数据,并且再在pdf中追加两页图片. 二.方案 手工设计一个pdf模板,这个具体步骤就不再赘述 ...
- ././include/linux/kconfig.h:4:32: fatal error: generated/autoconf.h: No such file or directory 解决办法
我在编写内核驱动模块的时候报了一个非常奇怪的错误,如下图: 在目录下看了一下确实没有发现这个文件,感觉很奇怪,因为我记得之前编译模块是没有错误的,所以不可能是我代码写的有问题. 查阅了资料很多说要清除 ...
- 大数据系列4:Yarn以及MapReduce 2
系列文章: 大数据系列:一文初识Hdfs 大数据系列2:Hdfs的读写操作 大数据谢列3:Hdfs的HA实现 通过前文,我们对Hdfs的已经有了一定的了解,本文将继续之前的内容,介绍Yarn与Yarn ...
- 广告召回 Query-Ad Matching
小结: 1.最为基础的召回链路就是要保证召回层的相关性,但是相关性高的广告并不一定具有很高的商业价值,所以开始尝试将一些商业化业务指标作为召回的依据 百度凤巢新一代广告召回系统--"莫比乌斯 ...
- JVM调优 jdk版本 机器配置 建议jvm参数 备注
https://juejin.im/post/5b091ee35188253892389683 大型跨境电商JVM调优经历 前提:某大型跨境电商业务发展非常快,线上机器扩容也很频繁,但是对于线上机器的 ...
- windows IOCP 实践
关于 windows IOCP 有人说 windows IOCP 是 windows 上最好的东西. IOCP 是真正的异步 IO,意味着每次发起一个 IO 请求,该调用本身则立即返回, 而包括 IO ...
- jsaper子报表Subreport(父子报表互相传值)
有很多人都说Jasperreports不适合中国式复杂报表,实际上运用好父子报表可以解决大部分问题了.例如下面的表.每个学生的学科数目不固定,且每个学生后有相当于小计的平均分.有点复杂度的报表,可以使 ...