一、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. websocket的应用---Django

    websocket的应用---Django 1.长轮询 轮询:在前端通过写js实现.缺点:有延迟.服务器压力大. 就是客户端通过一定的时间间隔以频繁请求的方式向服务器发送请求,来保持客户端和服务器端的 ...

  2. uni-app开发经验分享十七: 开发微信公众号(H5)JSSDK 的使用方式

    因为这个jssdk被uni-app坑了好多天,作者说支持1.4版本,但是我用1.4的两个分享的新方法一直不支持. 最后只能放弃了,期待什么时候能更新上. 基本的使用方法:第一步 - 下载使用方式下载地 ...

  3. YARN运行流程

  4. 无法获取 vmci 驱动程序版本: 句柄无效。 驱动程序 vmci.sys 版本不正确。请尝试重新安装 VMware Workstation。 打开模块DevicePowerOn电源失败。

    1.别打开电源,然后到虚拟机安装文件夹内.2.找到你的虚拟机系统文件中后缀为vmx的文件,右击用记事本或者Notepad++打开.2.搜索找到vmci0.present='TRUE',字段,把true ...

  5. java虚拟机——轻松搞懂jvm

    一.JVM体系结构概述 JVM位置 JVM体系结构 1.1 类加载器 ClassLoader   类加载器(ClassLoader)负责加载class文件,class文件在文件开头有特定的文件标示,并 ...

  6. 《Effective C#》之减少装箱和拆箱

    <Effective C#>之减少装箱和拆箱_天极网 http://dev.yesky.com/msdn/359/3486359.shtml <Effective C#>之减少 ...

  7. call by value reference name python既不是按值传递也不是按引用传递 python复制原理 创建新对象 与 改变原对象

    按名调用 Algol 按值调用 Java https://docs.python.org/3.6/faq/programming.html#how-do-i-write-a-function-with ...

  8. HTML5 学习表格应用

    <table> <tr> ---tr 定义行 <td>第1个单元格的内容</td> ----td 定义列 <td>第2个单元格的内容< ...

  9. 后台获取日期值,前台Js对日期进行操作

    需求描述: 方法一: 方法二: 一些标签常用隐藏方法: 需求描述: 在初始化页面的时候,需要根据系统当前的时间对前台JSP页面的某项进行值的初始化,若前台JSP标签没有相关可以初始化的属性,那么可以从 ...

  10. Aruba无线控制器常用操作

    初始配置 1.console到初始化的无线控制器上 Enter System name [Aruba7005]: Enter VLAN 1 interface IP address [172.16.0 ...