这篇博客主要是对计算机网络自顶向上做的阅读笔记,深入地了解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、SYN\FIN用于连接建立和拆除。PSH被设置时,指示接收方应立即将数据交给上层,URG指示报文段中有紧急数据

面向连接的传输TCP(一)的更多相关文章

  1. [计算机网络-传输层] 面向连接的传输:TCP

    参考:http://blog.csdn.net/macdroid/article/details/49070185 在学习TCP之前我们先来看一下可靠数据传输需要提供什么样的机制: ·差错检测机制:检 ...

  2. 无连接运输的UDP、可靠数据传输原理、面向连接运输的TCP

    由[RFC 768]定义的UDP只是做了运输协议能够做的最少工作.除了复用/分解功能极少量的差错检测外,它几乎没有对IP增加别的东西.如果应用程序开发人员选择UDP而不是TCP,则该应用程序差不多就是 ...

  3. 网络传输--TCP

    TCP网络编程 一.TCP简介 二.TCP网络程序--客户端 三.TCP网络程序--服务端 四.TCP知识总结 五.文件下载案例 六.3次握手和4次挥手 回到顶部 一.TCP简介TCP 1.TCP的简 ...

  4. 文件传输——TCP/IP协议介绍总结

    一.链路层 数据链路层的工作特性: 1.为IP模块发送和接收IP数据报2.为ARP模块发送ARP请求和接收ARP应答(ARP:地址解析协议,将IP地址转换成MAC地址)3.为RARP发送RARP请求和 ...

  5. Java实现TCP之Echo客户端和服务端

    Java实现TCP之Echo客户端和服务端 代码内容 采用TCP协议编写服务器端代码(端口任意) 编写客户机的代码访问该端口 客户机按行输入 服务器将收到的字符流和接收到的时间输出在服务器consol ...

  6. socket创建TCP服务端和客户端

    看情况选择相对应的套接字*面向连接的传输--tcp协议--可靠的--流式套接字(SOCK_STREAM)*面向无连接的传输--udp协议--不可靠的--数据报套接字(SOCK_DGRAM) 在liun ...

  7. Java实现UDP之Echo客户端和服务端

    Java实现UDP之Echo客户端和服务端 代码内容 采用UDP协议编写服务器端代码(端口任意) 编写客户机的代码访问该端口 客户机按行输入 服务器将收到的字符流和接收到的时间输出在服务器consol ...

  8. 4-socket套接字编程

    socket套接字编程 目标:根据socket模块提供的接口函数,进行组合使用完成基于tcp或者udp的网络编程. 套接字:完成上述目标的一种编程手段,编程方案. 套接字分类: 流式套接字(sock_ ...

  9. 网络TCp数据的传输设计(黏包处理)

    //1.该片为引用别人的文章:http://www.cnblogs.com/alon/archive/2009/04/16/1437599.html 解决TCP网络传输"粘包"问题 ...

随机推荐

  1. Ubuntu16.04 - 安装Courier New字体

    这应该是一个很简单的任务吧?网上很多地方告诉我们,只要在shell终端里面执行命令:"sudo apt-get installttf-mscorefonts-installer"就 ...

  2. 《Python黑帽子:黑客与渗透测试编程之道》 扩展Burp代理

    下载jython,在Burpsuite的扩展中配置jython路径: Burp模糊测试: #!/usr/bin/python #coding=utf-8 # 导入三个类,其中IBurpExtender ...

  3. 点分治&&动态点分治学习笔记

    突然发现网上关于点分和动态点分的教程好像很少……蒟蒻开篇blog记录一下吧……因为这是个大傻逼,可能有很多地方写错,欢迎在下面提出 参考文献:https://www.cnblogs.com/LadyL ...

  4. Django 一些少用却很实用的orm查询方法

    一.使用Q对象进行限制条件之间 "或" 连接查询 from django.db.models import Q from django.contrib.auth.models im ...

  5. 打开SVN server图形化管理界面

    来源:http://blog.csdn.net/u013495063/article/details/76796079 1.在ViaualSVN Service的安装目录:C:\Program Fil ...

  6. 在Load average 高的情况下如何鉴别系统瓶颈

    在Load average 高的情况下如何鉴别系统瓶颈.是CPU不足,还是io不够快造成? 或是内存不足? 一:查看系统负载vmstat procs -----------memory-------- ...

  7. [JavaScript] css将footer置于页面最底部

    <!-- 父层 --> <div id="wapper"> <!-- 主要内容 --> <div id="main-conten ...

  8. 向 webview 添加 userScript

    添加前,网页代码如下: <!DOCTYPE html> <html> <!--<script type="text/javascript"> ...

  9. python多态和鸭子类型

    多态与多态性 多态指的是一类事物有多种形态,(一个抽象类有多个子类,因而多态的概念依赖于继承). 比如:文件分为文本文件,可执行文件(在定义角度) 比如 我们按下 F1 键这个动作: 如果当前在 Fl ...

  10. Java虚拟机执行引擎

    执行引擎 关于执行引擎相关的部分, 在之前的博文里 Java内存区域中已经有所提及. 回顾一下: 也只有几个概念, JVM方法调用和执行的基础数据结构是 栈帧, 是内存区域中 虚拟机栈中的栈元素, 每 ...