Fluge Site

TCP是一个非常复杂的面向连接的协议,在很30多年来,各种优化变种争论和修改不断,所以我先从连接的建立和终止开始写TCP。后面应该还有几篇文章写TCP的另外几个特别重要的特性。
TCP最开始被我知道就先从很有特点的链接建立和终止—三次握手和四次挥手,基本上TCP协议的可靠性就是从保证连接的可靠性开始的。

TCP链接的建立—三次握手

对于三次握手,其实是TCP比较著名的东西了,在完全不了解这个TCP的时候就知道有这个东西了,但是开始的时候总有一点让我非常的疑惑:TCP为什么是三次握手,为什么不是两次或四次?

TCP 为什么是三次握手,为什么不是两次或四次?

要解释这个问题,首先明白TCP出现的价值和思路:是为了在不可靠的互联网络上提供一个可靠的端到端字节流而设计的,并且一个TCP连接是全双工。这是TCP很重要的一个设计理念:提供了一种可靠的,面向连接的字节流运输层服务,并且是双全工的。这里需要理解双全工的意思:就是两端之间进行通信,这两端既可以是数据的接收方,也可以是数据的发送方。
1、 可靠模型:但是为了数据的安全送达,就必须在发送数据前向另一个端口进行通信

数据发送端A:嘿,我想发送数据了,可以么。
数据接收端B:好的,这边允许接受。

然后数据的发送端就可以发送数据了,这里就基本保证你发的在接收方会正常的接受并不会发错。这是发送数据的基本可靠模型
2、 连接模型:在TCP的要求中,需要一种面向连接的通信:连接在我理解中就是相当于有一根空水管,连接两个水池(为两个水池传输东西),在水管中传输东西的效率肯定会高于用桶去一桶桶的装,来的方便。

TCP

原文
TCP的可靠性不止建立在建立一个稳固的链接上,还有就是数据包丢失的重传机制,和防止网络波动的拥塞处理机制,这些都是慢慢发展而来的。
要先了解TCP的重传和拥塞处理,需要先了解两个很常见的变量–RTT和RTO,这两个是对重传和拥塞很重要的概念。

RTT(Round Trip Time):就是发送一个数据包的往返时间的测量,由于路由器和网络流量均会变化,因此我们认为这个时间可能经常会发生变化,TCP应该跟踪这些变化并相应地改变其超时时间。
RTO(Retransmission TimeOut):重传超时时间,是根据RTT计算得到的。

重传

在重传机制中,首先在介绍重传的几个机制前,要注意。接收端给发送端的Ack确认只会确认最后一个连续的包。比如:发送端发了1,2,3,4,5一共五份数据,接收端收到了1,2,于是回ack 3,然后收到了4(注意此时3没收到,3丢失)此时的TCP会怎么办?我们要知道,因为正如前面所说的,SeqNum和Ack是以字节数为单位,所以ack的时候,不能跳着确认,只能确认最大的连续收到的包,不然,发送端就以为之前的都收到了。

TCP

ICMP网络控制报文协议

ICMP经常被认为是IP层的一个组成部分,它传递差错报文以及其他需要注意的信息。ICMP报文通常被IP层或更高层协议(UDP,TCP)使用。ICMP报文是在IP数据报内部传输的。由于IP是不可靠的协议,不能保证IP数据报能够成功到达目的主机,无法进行差错控制。但是这些信息会由ICMP将错误信息封包,然后传递给主机,让主机有处理错误的机会。

ICMP数据报由8bit的错误类型和8bit的代码(表示制定类型中的一个功能,如果只有一个功能,代码就置0)以及16bit的校验和组成,检验和字段覆盖整个ICMP报文。
ICMP报文大致可以分为:差错报文和查询报文。因为对ICMP的差错报文需要做一些特殊响应,需要进行区分。比如在对差错报文进行响应的时候,永远不会产生另一个ICMP差错报文,防止不断的产生差错一直循环。同时一下几种情况也不会产生ICMP差错报文:

  1. ICMP差错报文不会产生
  2. 目的地址是广播地址或多播地址的IP数据报
  3. 作为链路层广播的数据报
  4. 不是IP分片的第一片
  5. 源地址不是单个主机的数据报

基本认识

 最近一次接触ip是在我读《TCP/IP详解》时读到了,其实我感觉这些基础对理解整个互联网的结构都有一些很好的认识,在TCP/IP的协议簇中,首先简单的说一下在TCP中分层:

  • 数据链路层:一般都是物理设备驱动程序和接口
  • 网络层:处理分组在网络中的活动,如分组选路。TCP/IP中,IP协议,ICMP协议,IGMP协议
  • 运输层:主要为应用程序提供端到端的通信,主要包括两种协议:TCP(高可靠的)、UDP(不可靠的,效率高的)
  • 应用层:负责处理特定的应用程序的细节

    上图是我认为对TCP/IP分层的理解很好的一张图TCP/IP分层和传统的OSI分层不一样。OSI的7层是分的更加详细。对于TCP/IP的协议簇重点关注的还是网络层,运输层。
ip