一、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字节)

references:理解TCP

  • 源端口号:表示发送端端口号,字段长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的更多相关文章

  1. 计算机网络及TCP/IP知识点(全面,慢慢看)

    TCP/IP网络知识点总结 一.总述 1.定义:计算机网络是一些互相连接的.自治的计算机的集合.因特网是网络的网络. 2.分类: 根据作用范围分类: 广域网 WAN (Wide Area Networ ...

  2. 计算机网络 之 TCP协议报文结构

    前言:上学期实训课,由于要做一个网络通信的应用,期间遇到各种问题,让我深感计算机网络知识的薄弱.于是上网查找大量的资料,期间偶然发现了roc大神的博客,很喜欢他简明易懂的博文风格.本文受roc的< ...

  3. 计算机网络要点---TCP

    计算机网络要点---TCP 浏览器在通过域名通过dns服务器找到你的服务器外网ip,将http请求发送到你的服务器,在tcp3次握手之后(http下面是tcp/ip),通过tcp协议开始传输数据,你的 ...

  4. 计算机网络(7)-----TCP协议概述

    传输控制协议(Transmission Control Protocol) 概念 一种面向连接的.可靠的.基于字节流的传输层通信协议,由IETF的RFC 793定义.在简化的计算机网络OSI模型中,它 ...

  5. Day 6-1计算机网络基础&TCP/IP

    按照功能不同,人们将互联网协议分为osi七层或tcp/ip五层或tcp/ip四层(我们只需要掌握tcp/ip五层协议即可) 每层运行常见物理设备: TCP/IP协议: Transmission Con ...

  6. 计算机网络知识—(TCP)

    计算机网络在IT行业的重要性 IT即互联网技术,从事的工作和网络有很大的关系,前端要负责和后台(服务器)进行交互,其必然得经过网络,所以懂点网络知识有很大的帮助. 网络模型数据处理过程 传输层协议的作 ...

  7. 计算机网络:TCP协议建立连接的过程为什么是三次握手而不是两次?【对于网上的两种说法我的思考】

    网上关于这个问题吵得很凶,但是仔细看过之后我更偏向认为两种说的是一样的. 首先我们来看看 TCP 协议的三次握手过程 如上图所示: 解释一下里面的英文: 里面起到作用的一些标志位就是TCP报文首部里的 ...

  8. 初探计算机网络之TCP/IP网络协议

    网络协议 ​ 在计算机诞生以来,从最原始的单机模式到现在多台计算机协同工作,形成计算机网络,从前很难想象的信息共享.多机合作.大规模计算在今天也早已成了现实.在早期,计算机网络需要解决的痛点,就是怎样 ...

  9. 计算机网络(11)-----TCP连接的建立和释放

    TCP连接的建立和释放 概述 TCP运输连接的建立和释放是每一次面向连接的通信中必不可少的过程,运输连接有三个阶段:连接建立,数据传送和连接释放. TCP连接的建立 如图所示,假定A主机是客户端程序, ...

随机推荐

  1. 1.5V升3.3V芯片电路图,稳压3.3V供电MCU模块等

    干电池1.5V可以升到3.3V,通过PW5100干电池升压IC,于外围3个元件:2个电容和一个电感即可组成1.5V升3.3V的电路系统. 干电池属于低能量的电池产品,不过一般使用到干电池的产品也是输出 ...

  2. Docker 拉取镜像速度太慢

    Docker Hub 是我们分发和获取 Docker 镜像的中心,但由于服务器位于海外,经常会出现拉取/上传镜像时速度太慢或无法访问的情况.再加上运营方不断对 Docker Hub 的免费使用进行限制 ...

  3. synchronized的jvm源码分析聊锁的意义

    上篇写完了ReentrantLock源码实现,从我们的角度分析设计锁,在对比大神的实现,顺道拍了一波道哥的马屁,虽然他看不到,哈哈.这一篇我们来聊一聊synchronized的源码实现,并对比reen ...

  4. OO第三次总结博客

    规格化设计的发展历史 (因为很难寻找,所以参考了下别的同学的调研结果) 规格化设计与结构化.模块化设计密不可分,伴随着OOP语言的发展,规格化设计思想逐渐形成体系,慢慢完善. 20世纪60年代,程序的 ...

  5. 简单监控liunx中cpu、内存、磁盘及发送邮件参考

    shell脚本 vim jk.sh  #命名脚本名   #!/bin/bash time=`date "+%Y-%m-%d %H:%M:%S"`      #定义时间 echo & ...

  6. Swagger-UI展示接口

    简单介绍API的管理工具Swagger的UI模块. 简介:swagger ui就是一个能整合到项目中让api的注释能够生成到一个网页上.能简单测试和给前端看. 第一步:添加引用 打开NuGet程序包管 ...

  7. 提供一个HDFS内的文件的路径,对该文件进行创建和删除操作。如果文件所在目录不存在,则自动创建目录。

    1 import java.text.SimpleDateFormat; 2 3 import org.apache.hadoop.fs.FSDataOutputStream; 4 import or ...

  8. testng学习笔记-- beforesuit和aftersuit

    一.定义 测试套件,主要关注执行顺序 套件:suit可以包含多个class 二.代码标签 三.运行结果

  9. vue初始化页面闪动问题

    使用vue开发时,在vue初始化之前,由于div是不归vue管的,所以我们写的代码在还没有解析的情况下会容易出现花屏现象,看到类似于{{message}}的字样,虽然一般情况下这个时间很短暂,但是我们 ...

  10. vim 查找并替换多个匹配字符

    通常我们在使用vim的使用需要查找文档中是否含有需要的字符 1.vim 1.txt进入文档编辑 2.输入/键,再输入需要查找的字符,或者输入?键再输入需要查找的字符 3.查找到后可以enter进去,再 ...