(参考文献)TCP/IP详解,卷1:协议

TCP的服务

尽管TCP和UDP都使用相同的网络层(IP层),TCP却向应用层提供与UDP完全不同的服务。TCP提供一种面向连接的、可靠的字节流服务。

面向连接意味着,两个使用TCP的应用(通常是一个客户和一个服务器)在彼此交换数据之前必须先建立一个TCP连接。这一过程与打电话很相似,先拨号振铃,等待对方摘机说“喂”,然后才说明是谁。TCP通信,本质上是两个线程之间的通信(客户端与服务端);而TCP连接的建立,本质上是可以说是服务端和客户端通过交换信息,各端都建立了一个进程拥有完整地理信息的进程或者线程(即这个线程或进程知道目的端ip地址和目的端端口号)。

在一个TCP连接中,仅有两方进行彼此通信。TCP通过以下方式来提供可靠性:

  • 应用数据被分割成TCP认为最适合发送的数据块。这和UDP完全不同,UDP应用程序产生的数据报长度将保持不变。由TCP传给IP的信息单位称为报文段或段。
  • 当TCP发送一个段后,他启动一个定时器等待目的端确认收到这个报文段。如果不能及时收到一个确认,将重发这个报文段。
  • 当TCP收到发自TCP连接另一端的数据,他将发送一个确认。这个确认不是立即发送,通常将推迟几分之一秒。
  • TCP保持和他首部数据的校验和。这是一个端到端的校验和,目的是监测数据在传输过程中的任何变化。如果收到段的校验和有差错,TCP将丢弃这个报文段(希望发送端超时并重发)。
  • 既然TCP报文段作为IP数据报来传输,而IP数据报的到达可能会失序,因此TCP报文段的到达也可能会失序。如果必要,TCP将收到的数据进行重新排序,将收到的数据以正确的顺序交给应用层。
  • 既然IP数据报会发生重复,TCP的接收端必须丢弃重复的数据。
  • TCP还能提供流量控制。TCP连接的每一方都有固定大小的缓冲空间。TCP的接收端只允许另一端发送接收缓冲区所能接纳的数据,这将防止较快主机至使较慢主机的缓冲区溢出。

TCP对字节流的内容不做任何解释,他只管将报文段接收和排序然后交给应用层。TCP不知道传输的数据字节流是二进制数据还是ASCII字符,对字节流的解释有TCP连接双方的应用层解释。

TCP的首部

TCP数据被封装在一个IP数据报中,如下:

如下,是TCP首部的数据格式,如果笔记选项字段,他通常是20个字节

每个TCP都包含源端和目的端的端口号,用于寻找发端和接收端应用进程。这两个值加上IP地址中的源端IP地址和目的端IP地址可以唯一确定一个TCP链接。

一个IP地址和一个端口号也称作一个插口或叫套接字(socket)。一个插口(包含客户端IP地址,客户端端口号,服务器IP地址和服务器端口号)可以唯一确定互联网络中每个TCP链接的双方。

TCP首部中有6个标志比特。他们中的多个可同时被设置为1 。

URG  紧急指针有效

ACK  确认序号有效

PSH  接收方应该尽快将这个报文交给应用层

RST  重建连接

SYN  同步序号用来发起一个连接

FIN   发端完成发送任务

TCP建立连接的三次握手:

1)请求端(通常称为客户)发送一个SYN段来指明客户打算连接的服务器的端口,以及初始序号(ISN,在这里假设为1415531521)。这个SYN段为报文段1 。

2)服务器发回包含服务器的初始序号的SYN报文段(报文段2)作为应答,同时将确认序号设置为客户的ISN加1以对客户的SYN报文段进行确认。一个SYN将占用一个序号。

3)客户必须将确认序号设置为服务器的ISN加1以对服务器的SYN报文段进行确认(报文段3)。

这三个报文段完成连接的建立。这个过程也称为3次握手。

发送第一个SYN的一端将执行手动打开。接收到这个SYN并发回下一个SYN的另一端执行被动打开。

当一端为建立连接而发送它的SYN时,他为连接选择一个初始序号(ISN)。ISN的选择随时间变化,因此每个连接都具有不同的ISN。RFC 793[Postel 1981c]指出ISN可看做是一个32比特的计数器,每隔4ms加1.

TCP建立连接终止的四次握手:

建立一个连接需要3次握手,而终止一个连接则需要4次握手。这由于TCP的半关闭造成的。TCP连接是全双工的(即两个方向上可以同时传输数据),因此,每个方向必须单独的进行关闭。原则就是:当一方完成它的数据发送任务后,就会发送一个FIN来终止这个方向的连接。发送FIN通常是应用层进行关闭的结果。

收到一个FIN只意味着在在这个方向上没有数据的流动。一个TCP连接收到一个FIN后任然能发送数据。而这对于利用半关闭的应用来说是可能的尽管应用程序能够利用这种半关闭特性,但在实际应用中只有很少的TCP应用程序这么做。

首先进行关闭的一方(及发送第一个FIN)将执行主动关闭,而另一方(收到这个FIN)执行被动关闭。通常一方完成主动关闭而另一方完成被动关闭。

当服务器收到这个FIN,他发回一个ACK,确认序号为收到的序号加1 。和SYN一样,一个FIN将占用一个序号。同时TCP服务器还向应用程序(客户)传输一个结束符。接着这个客户程序就关闭他的TCP连接,导致他的TCP端发送一个FIN,客户必须发回一个确认,并将确认序号设置为收到序号加1 。

连接通常是由客户端发起的,这样第一个SYN从客户传到服务器。每一段都能主动关闭这个连接(即首先发送FIN)。然而,一般有客户端决定何时终止连接,因为客户进程通常由用户交互控制,用户会键入如“quit”一样的命令来终止进程。

TCP的半关闭

TCP提供了连接的一端在结束他的发送后还能结束来自另一端数据的能力。这就是所谓的半关闭(只有很少的应用会使用到半关闭)。

TCP的半打开连接

如果一方已经关闭或异常终止连接而另一方却还不知道,我们将这种TCP连接成为半打开的。任何一端的主机异常都可能产生这种情况。只要不在半打开连接上传输数据任然处于连接状态的一方就不会坚持到另一方已经出现异常。

半打开连接的另一个常见原因是当客户主机突然掉电而不是正常的结束客户应用程序后在关机。

TCP:传输控制协议简单讲解(八)相关推荐

  1. TCP 传输控制协议(转)

    开头先说几个协议: IP:网际协议 TCP:传输控制协议 Http:超文本传输协议 AMQP:高级消息队列协议 一:TCP是什么? TCP(Transmission Control Protocol ...

  2. TCP 传输控制协议(Transmission Control protocol)

    TCP(Transmission Control Protocol,传输控制协议)是一种面向连接的.可靠的.基于字节流的通信协议,数据在传输前要建立连接(三次握手),传输完毕后还要断开连接(四次挥手) ...

  3. 传输控制协议---TCP协议【详解】

    目录 一.协议简介 二.TCP报文格式 1.字段解析 2.报文解析 三.TCP的重传机制 1.超时重传 2.快速重传 3. SACK 方法 4.Duplicate SACK 四.TCP的滑动窗口机制 ...

  4. 计算机网络tcp传送,计算机网络基础课程—传输控制协议(Tcp)

    原标题:计算机网络基础课程-传输控制协议(Tcp) •TCP和UDP都使用相同的网络层(IP),但TCP向应用层提供与UDP完全不同的服务. •TCP提供一种面向连接的.可靠的字节流服务. •UDP提 ...

  5. TCP、UDP以及HTTP的简单讲解

    先来一个讲TCP.UDP和HTTP关系的 1.TCP/IP是个协议组,可分为三个层次:网络层.传输层和应用层. 在网络层有IP协议.ICMP协议.ARP协议.RARP协议和BOOTP协议. 在传输层中 ...

  6. 网际传输协议和传输控制协议(IP,TCP,IP)

    文章目录 1 简介 2 IP 2.1 简介 2.2 IP的可靠性 2.1 IP Header 2.3 IP分片和重组 3 TCP 3.1 简介 3.2 TCP Header 3.3 TCP 三次握手 ...

  7. TCP/IP 中文译名为传输控制协议/因特网互联协议,又叫网络通讯协议

    原文地址:http://hi.baidu.com/albyuyrgqgbbhoq/item/65006d2d002ab33195f62ba1 TCP/IP(Transmission Control P ...

  8. 【RFC7414 传输控制协议 (TCP) 规范文档的路线图】(翻译)

    原文 rfc7414 (ietf.org)   A Roadmap for Transmission Control Protocol (TCP) Specification Documents  传 ...

  9. TCP(传输控制协议)简介

    TCP是一个面向连接的.端到端的可靠的传输层协议.位于TCP/IP网络分层架构中的第三层,底层是IP协议.IP把TCP段封装在数据报中发送到网络上. TCP的正式标准是RFC793,后序又有许多其他R ...

最新文章

  1. Eigen 学习笔记
  2. RHEL5.1NFS+NIS+Authconfig+Autofs实现自动挂载NIS用户主目录
  3. Android热修复技术原理详解(最新最全版本)
  4. shell 脚本,将/etc/目录下所有的软链接文件输出
  5. 关于blog的编写 规则
  6. 阿里巴巴中间件在 Serverless 技术领域的探索
  7. Button按钮多行显示的实现方法
  8. 大数的加减法C语言程序设计,超大数相加C语言程序设计
  9. webpack插件实现自动抽取css中的主题色样式,并动态切换主题色(element-ui)
  10. Java判断是否为移动端
  11. Google Chrome谷歌浏览器繁体字修改为简体字
  12. 毕设格式 页眉页脚 如何设置(WPS)
  13. Python - matplotlib - 如何探索两个变量间关系?
  14. [ElasticSearch ]2轻量级搜索
  15. Windows下Python安装教程与常见问题
  16. java数据类型图:
  17. 营销-营销方式:营销方式
  18. 开源社区的由来(转载)
  19. 血压计模块|臂式血压计方案
  20. 搜索进阶之迭代加深搜索

热门文章

  1. 用Maven构建Mahout项目
  2. LaTex文章中插入Visio及Matlab矢量图
  3. 如何设计一门语言(三)——什么是坑(面向对象和异常处理)
  4. Scala基础教程(九):提取器、文件I/O
  5. 《大话数据结构》第9章 排序 9.2 排序的基本概念与分类
  6. nodejs 日志规范
  7. scoped原理、不足、弥补或替代
  8. SQLServer 大小写敏感配置
  9. linux下查看tomcat的启动日志
  10. 《CCNP SWITCH 300-115认证考试指南》——第1章 企业园区网络的设计