zoukankan      html  css  js  c++  java
  • 面向连接的传输TCP(一)

    这篇博客主要是对计算机网络自顶向上做的阅读笔记,深入地了解TCP

    一、TCP连接

    1.特点:

    a.TCP是面向连接的,因为一个进程在向另一个进程进行数据传输之前必须先要握手,即要互相发送报文,以确认信息传输的参数。并且连接时双方都要初始化一些参数和状态变量

    b.TCP协议只能在端系统中运行,中间路由器对TCP完全视而不见

    c.TCP是全双工服务。如果A到B存在TCP连接,那么数据可以从A流向B,也可以从B流向A

    d.点对点,也就是说他不能像UDP那样多播,不能从一个发送方送给多个接收方

    2.TCP连接的建立

    当一个主机上的进程想要与另一个主机的进程建立起连接。则发起请求的一方称为客户端,另一个就是服务端。

    发起请求(python):  clientServer.connect((serverName,serverPort))//ServerName标识了服务器名称,serverPort标识端口

    然后客户端向服务器发送TCP报文段,服务器用另一段报文段来响应,最后客户再用三个特殊的报文段来响应。前两个报文段不承载有效数据,第三个报文段可以承载有效数据。由于发送了三个报文段,TCP连接这种过程被称为三次握手。(TCP报文段就是TCO的数据加上首部信息形成的)

    3.传输数据

    建立起连接之后就可以互相发送数据了,当数据到达TCP的传送门之后,TCP会把数据放到它的发送缓存中,就由TCP控制它什么时候把信息取出来。TCP从发送缓存取出数据大小受限于MSS(报文段里应用层最大数据)。MSS通常为1460字节(首部占40字节)

    TCP报文段在IP中传输,会封装到IP的数据报中,然后被发送到网络中,当TCP在另一端收到这个报文段。报文段的数据就会进入TCP缓存

    二、TCP的报文段

    可以看出TCP报文段是由首部和数据组成的,应用数据受限于MSS,TCP发送文件,会把数据划分为几个MSS(最后一个通常小于MSS),而首部看起来信息就很多了,比起UDP来说字段就多了很多,了解报文段字段的作用,我们就能够进一步深入了解TCP能够给传输层带来什么。

    1.源端口和目的端口

    和UDP一样TCP也提供了多路分解和多路复用。

    我们都知道传输层就是通过套接字来传递数据的,套接字是由IP+端口组成的。

    多路分解就是将运输层的数据传输给正确的套接字:在源主机上从不同的套接字收集信息。

    多路复用就是将信息加上首部打包好生成报文段之后传递到网络层的过程。所以TCP包含源和目的端口,这样才能保证多路分解和多路复用。

    2.检验和字段

    这个同UDP一样包括检验和字段。用来提供差错检测

    3.序号字段和确认号字段

    这两个字段是TCP报文中最重要的两个字段,使TCP能提供了可靠数据传输

    序号字段:就是把数据分段,然后标序号

    假如A要从B发送数据流,包含500000字节,MSS长度为1000字节,那么TCP要为这个数据构建500个报文段,并分配序号,第一个序号0,第二个序号1000,第三个序号2000。

    确认号:一个主机A填充的想要下一次从主机B接收到的下一个字节的序号。因为TCP是全双工的,从A发送到B的同时也要从B接收到数据,如果意外丢包,能够通过确认号发现。

    既然序号和确认号这么重要,那我们来看一个简单的案例吧。

    假设客户发送了字符C,并喝起了咖啡,那么客户端和服务端之间会发生什么呢,假设初始化客户端和服务端序号42和79.

    第一次握手:用户序号42(也就是该报文段数据的首字节),确认号79(也就是希望服务器应答的序号是79),数据段中包含‘C’(这是一种捎带)

    第二次握手:服务器发送报文段,它有两个目的,确认他收到的数据,第二个目的回显字符'C',所以它在确认号填入43,,序号79(这是起始的序号),数据端里填入的是字符C

    第三次握手:确认号80(因为79及以前的字节流已经收到),序号43,它的唯一目的就是确认已经收到服务器的数据,此时数据段没有数据

    4.接收窗口字段

    用于流量控制,指示接收方愿意接收到的字节

    5.首部长度

    由于TCP长度可变,该字段由于指示TCP报文段长度

    6.选项字段

    指示发送方和接收方协商的MSS

    7.标识字段

    ACK用于指示确认字段是有效的,RST、SYNFIN用于连接建立和拆除。PSH被设置时,指示接收方应立即将数据交给上层,URG指示报文段中有紧急数据

  • 相关阅读:
    centos免密码登录
    conda3 快速下载python包
    Flink问题及解决方案
    git把项目推送到不同的remote(git地址)
    选择器提取内容
    spark写入mysql
    flume简介及netcat样例
    Spark 读取 Hbase 优化 --手动划分 region 提高并行数
    shell grep正则表达式
    Hibernate持久化
  • 原文地址:https://www.cnblogs.com/HannahLihui/p/10078496.html
Copyright © 2011-2022 走看看