tcpip_tcpip协议 - CSDN
精华内容
参与话题
  • TCP/IP 原理详解

    万次阅读 2016-10-02 10:44:16
    协议实际上就是一种解决某些问题的策略和模式,在经典的TCP/IP协议中就有很多策略和模式值得学习。归纳起来有以下一些(随着学习深入逐步添加): 分层封装和分用可靠连接 分层 分层是TCP/IP乃至网络通信最核心的...

    协议实际上就是一种解决某些问题的策略和模式,在经典的TCP/IP协议中就有很多策略和模式值得学习。归纳起来有以下一些(随着学习深入逐步添加):

    • 分层
    • 封装和分用
    • 可靠连接

    分层

    分层是TCP/IP乃至网络通信最核心的策略和模式,分层使得所有的网络应用程序不用关心底层链路传输的细节,也使得不同类型的网络有效地互通。这是一种典型的化繁为简,把复杂的事情分解到不同层面的策略,层与层之间是服务与被服务的关系,每层只需关注所在维度的事情。例如,通过网络层IP协议的抽象和处理,把不同类型的网络互连起来,并且这些底层传输的差异对于上层(运输层和应用层)是透明的,这给上层应用程序的开发带来了极大的方便,示意图如下所示:

    封装和分用

    为了实现和支持上面说的分层策略,TCP/IP在数据包设计上采用封装和分用的策略,所谓封装就是在应用程序在发送数据的过程中,每一层都增加一些首部信息,这些信息用于和接收端同层次进行沟通,例如当数据从应用程序发送到以太网过程中数据逐层加工的示意图如下所示:

    而在接收端的处理过程就正好相反,也就是所谓的分用策略,数据从底层到最上层的应用程序过程中,数据被逐层拆分,每一层取出自己所需要的信息。如下图所示:

    可靠连接


    TCP采用三次握手的方式确保在可能丢包的情况下建立连接,通过连接双方的相互确认,以此达成连接协议。此外,通过非常细化的状态流转来对连接双方进行容错处理。这些设计细节对多系统交互设计有很大的借鉴作用


    TCP的可靠传输首先是建立在可靠的连接建立与关闭之上,这一块包含以下要点:

    • TCP三次握手建立连接
    • TCP半关闭
    • TCP的状态变迁
    • TCP服务端监听和处理设计

    TCP三次握手建立连接

    TCP为了通信双方确认建立起连接,设计了三次握手的策略,三次握手的过程如下:

    1) 请求端发送一个SYN段指明客户打算连接的服务器的端口,以及初始序号(ISN)。
    2) 服务器发回包含服务器的初始序号的SYN报文段作为应答。同时,将确认序号设置为客户的ISN加1以对客户的SYN报文段进行确认。一个SYN将占用一个序号。
    3) 客户必须将确认序号设置为服务器的ISN加1以对服务器的SYN报文段进行确认

    举一个实例:

    为什么是三次握手?

    对于这个问题,网络编程中的一个经典的规则也许能给一些提示:别人告诉你成功了那一定是成功了,没告诉你成功不一定是没成功。因此,如果是设计成两次握手,就有可能是被连接方第一次发出ack消息后,就处于成功建立连接的状态,但这条消息丢失了,主动连接方因为没有收到这个ack消息会认为建立连接失败,也许会放弃连接或启动新的连接,但被连接方会一直监听那个它误认为成功的连接。采用三次握手,前两次握手任何一次失败都会导致连接双方都处于未连接状态,第三次失败只会导致连接方处于成功状态,但做主动连接方,肯定会在连接不久后通过这个连接发送数据,这样就可以利用这个机制做进一步的容错。

    通过tcpdump工具能很清晰地看到三次握手的过程,先在主机B(itbu_qa17)上打开tcpdump监控

    /usr/local/sbin/tcpdump port 80 and host 10.19.14.1

    然后主机A(10.19.14.1) telnet到主机B,tcpdump监控结果如下:

    TCP半关闭

    TCP半关闭时TCP提供了连接的一端在结束它的发送后还能接收来自另一端数据的能力。因此,连接关闭的过程需要连接双方都要发起关闭连接的消息,示意图如下所示:

    为什么要设计成半关闭?

    设计成半关闭主要是存在无需发送数据,只需接收数据的需求,并且可以通过发起单方面的关闭请求标志已发送数据完成。如果没有半关闭的需求,就得建立两个连接。

    通过tcpdump工具能很清晰地看到三次握手的过程,主机A(10.19.14.1) telnet到主机B,然后在主机B(itbu_qa17)上打开tcpdump监控

    /usr/local/sbin/tcpdump port 80 and host 10.19.14.1

    然后主机A关闭telnet,tcpdump监控结果如下:

    TCP的状态变迁

    连接双方从新建连接到建立连接再到关闭连接,会经历一些状态,这些状态在分析问题时非常重要,状态变迁全景图如下所示:

    就连接双方的建立连接和关闭连接过程来看,状态变迁序列图如下所示:

    TCP服务端监听和处理设计

    TCP服务端一般设计为连接建立后一个进程监听端口,当一个新的连接请求到达服务器时,服务器接受这个请求,并调用一个新进程来处理这个新的客户请求。以telnet为例,使用netstat查看服务端监听状态为LISTEN,如下图所示:

    当有客户端telnet过来时,监听进程会起另外的进程来处理,如下图所示:


    TCP的可靠传输首先是建立在可靠的连接建立与关闭之上,这一块包含以下要点:

    • TCP三次握手建立连接
    • TCP半关闭
    • TCP的状态变迁
    • TCP服务端监听和处理设计

    TCP三次握手建立连接

    TCP为了通信双方确认建立起连接,设计了三次握手的策略,三次握手的过程如下:

    1) 请求端发送一个SYN段指明客户打算连接的服务器的端口,以及初始序号(ISN)。
    2) 服务器发回包含服务器的初始序号的SYN报文段作为应答。同时,将确认序号设置为客户的ISN加1以对客户的SYN报文段进行确认。一个SYN将占用一个序号。
    3) 客户必须将确认序号设置为服务器的ISN加1以对服务器的SYN报文段进行确认

    举一个实例:

    为什么是三次握手?

    对于这个问题,网络编程中的一个经典的规则也许能给一些提示:别人告诉你成功了那一定是成功了,没告诉你成功不一定是没成功。因此,如果是设计成两次握手,就有可能是被连接方第一次发出ack消息后,就处于成功建立连接的状态,但这条消息丢失了,主动连接方因为没有收到这个ack消息会认为建立连接失败,也许会放弃连接或启动新的连接,但被连接方会一直监听那个它误认为成功的连接。采用三次握手,前两次握手任何一次失败都会导致连接双方都处于未连接状态,第三次失败只会导致连接方处于成功状态,但做主动连接方,肯定会在连接不久后通过这个连接发送数据,这样就可以利用这个机制做进一步的容错。

    通过tcpdump工具能很清晰地看到三次握手的过程,先在主机B(itbu_qa17)上打开tcpdump监控

    /usr/local/sbin/tcpdump port 80 and host 10.19.14.1

    然后主机A(10.19.14.1) telnet到主机B,tcpdump监控结果如下:

    TCP半关闭

    TCP半关闭时TCP提供了连接的一端在结束它的发送后还能接收来自另一端数据的能力。因此,连接关闭的过程需要连接双方都要发起关闭连接的消息,示意图如下所示:

    为什么要设计成半关闭?

    设计成半关闭主要是存在无需发送数据,只需接收数据的需求,并且可以通过发起单方面的关闭请求标志已发送数据完成。如果没有半关闭的需求,就得建立两个连接。

    通过tcpdump工具能很清晰地看到三次握手的过程,主机A(10.19.14.1) telnet到主机B,然后在主机B(itbu_qa17)上打开tcpdump监控

    /usr/local/sbin/tcpdump port 80 and host 10.19.14.1

    然后主机A关闭telnet,tcpdump监控结果如下:

    TCP的状态变迁

    连接双方从新建连接到建立连接再到关闭连接,会经历一些状态,这些状态在分析问题时非常重要,状态变迁全景图如下所示:

    就连接双方的建立连接和关闭连接过程来看,状态变迁序列图如下所示:

    TCP服务端监听和处理设计

    TCP服务端一般设计为连接建立后一个进程监听端口,当一个新的连接请求到达服务器时,服务器接受这个请求,并调用一个新进程来处理这个新的客户请求。以telnet为例,使用netstat查看服务端监听状态为LISTEN,如下图所示:

    当有客户端telnet过来时,监听进程会起另外的进程来处理,如下图所示:







    展开全文
  • 关于TCP/IP,必须知道的十个知识点

    万次阅读 多人点赞 2018-06-24 22:18:58
    本文整理了一些TCP/IP协议簇中需要必知必会的十大问题,既是面试高频问题,又是程序员必备基础素养。一、TCP/IP模型TCP/IP协议模型(Transmission Control Protocol/Internet Protocol),包含了一系列构成互联网...

    本文整理了一些TCP/IP协议簇中需要必知必会的十大问题,既是面试高频问题,又是程序员必备基础素养。

    「每日分享」关于TCP/IP,必须知道的十个知识点

    一、TCP/IP模型

    TCP/IP协议模型(Transmission Control Protocol/Internet Protocol),包含了一系列构成互联网基础的网络协议,是Internet的核心协议。

    基于TCP/IP的参考模型将协议分成四个层次,它们分别是链路层、网络层、传输层和应用层。下图表示TCP/IP模型与OSI模型各层的对照关系。

    「每日分享」关于TCP/IP,必须知道的十个知识点

    TCP/IP协议族按照层次由上到下,层层包装。最上面的是应用层,这里面有http,ftp,等等我们熟悉的协议。而第二层则是传输层,著名的TCP和UDP协议就在这个层次。第三层是网络层,IP协议就在这里,它负责对数据加上IP地址和其他的数据以确定传输的目标。第四层是数据链路层,这个层次为待传送的数据加入一个以太网协议头,并进行CRC编码,为最后的数据传输做准备。

    「每日分享」关于TCP/IP,必须知道的十个知识点

    上图清楚地表示了TCP/IP协议中每个层的作用,而TCP/IP协议通信的过程其实就对应着数据入栈与出栈的过程。入栈的过程,数据发送方每层不断地封装首部与尾部,添加一些传输的信息,确保能传输到目的地。出栈的过程,数据接收方每层不断地拆除首部与尾部,得到最终传输的数据。

    「每日分享」关于TCP/IP,必须知道的十个知识点

    上图以HTTP协议为例,具体说明。

    二、数据链路层

    物理层负责0、1比特流与物理设备电压高低、光的闪灭之间的互换。 数据链路层负责将0、1序列划分为数据帧从一个节点传输到临近的另一个节点,这些节点是通过MAC来唯一标识的(MAC,物理地址,一个主机会有一个MAC地址)。

    「每日分享」关于TCP/IP,必须知道的十个知识点

    • 封装成帧: 把网络层数据报加头和尾,封装成帧,帧头中包括源MAC地址和目的MAC地址。
    • 透明传输:零比特填充、转义字符。
    • 可靠传输: 在出错率很低的链路上很少用,但是无线链路WLAN会保证可靠传输。
    • 差错检测(CRC):接收者检测错误,如果发现差错,丢弃该帧。

    三、网络层

    1.IP协议

    IP协议是TCP/IP协议的核心,所有的TCP,UDP,IMCP,IGMP的数据都以IP数据格式传输。要注意的是,IP不是可靠的协议,这是说,IP协议没有提供一种数据未传达以后的处理机制,这被认为是上层协议:TCP或UDP要做的事情。

    1.1 IP地址

    在数据链路层中我们一般通过MAC地址来识别不同的节点,而在IP层我们也要有一个类似的地址标识,这就是IP地址。

    32位IP地址分为网络位和地址位,这样做可以减少路由器中路由表记录的数目,有了网络地址,就可以限定拥有相同网络地址的终端都在同一个范围内,那么路由表只需要维护一条这个网络地址的方向,就可以找到相应的这些终端了。

    • A类IP地址: 0.0.0.0~127.255.255.255
    • B类IP地址:128.0.0.0~191.255.255.255
    • C类IP地址:192.0.0.0~239.255.255.255

    1.2 IP协议头

    「每日分享」关于TCP/IP,必须知道的十个知识点

    这里只介绍:八位的TTL字段。这个字段规定该数据包在穿过多少个路由之后才会被抛弃。某个IP数据包每穿过一个路由器,该数据包的TTL数值就会减少1,当该数据包的TTL成为零,它就会被自动抛弃。

    这个字段的最大值也就是255,也就是说一个协议包也就在路由器里面穿行255次就会被抛弃了,根据系统的不同,这个数字也不一样,一般是32或者是64。

    2.ARP及RARP协议

    ARP 是根据IP地址获取MAC地址的一种协议。

    ARP(地址解析)协议是一种解析协议,本来主机是完全不知道这个IP对应的是哪个主机的哪个接口,当主机要发送一个IP包的时候,会首先查一下自己的ARP高速缓存(就是一个IP-MAC地址对应表缓存)。

    如果查询的IP-MAC值对不存在,那么主机就向网络发送一个ARP协议广播包,这个广播包里面就有待查询的IP地址,而直接收到这份广播的包的所有主机都会查询自己的IP地址,如果收到广播包的某一个主机发现自己符合条件,那么就准备好一个包含自己的MAC地址的ARP包传送给发送ARP广播的主机。

    而广播主机拿到ARP包后会更新自己的ARP缓存(就是存放IP-MAC对应表的地方)。发送广播的主机就会用新的ARP缓存数据准备好数据链路层的的数据包发送工作。

    RARP协议的工作与此相反,不做赘述。

    3. ICMP协议

    IP协议并不是一个可靠的协议,它不保证数据被送达,那么,自然的,保证数据送达的工作应该由其他的模块来完成。其中一个重要的模块就是ICMP(网络控制报文)协议。ICMP不是高层协议,而是IP层的协议。

    当传送IP数据包发生错误。比如主机不可达,路由不可达等等,ICMP协议将会把错误信息封包,然后传送回给主机。给主机一个处理错误的机会,这 也就是为什么说建立在IP层以上的协议是可能做到安全的原因。

    四、ping

    ping可以说是ICMP的最著名的应用,是TCP/IP协议的一部分。利用“ping”命令可以检查网络是否连通,可以很好地帮助我们分析和判定网络故障。

    例如:当我们某一个网站上不去的时候。通常会ping一下这个网站。ping会回显出一些有用的信息。一般的信息如下:

    「每日分享」关于TCP/IP,必须知道的十个知识点

    ping这个单词源自声纳定位,而这个程序的作用也确实如此,它利用ICMP协议包来侦测另一个主机是否可达。原理是用类型码为0的ICMP发请 求,受到请求的主机则用类型码为8的ICMP回应。

    ping程序来计算间隔时间,并计算有多少个包被送达。用户就可以判断网络大致的情况。我们可以看到, ping给出来了传送的时间和TTL的数据。

    五、Traceroute

    Traceroute是用来侦测主机到目的主机之间所经路由情况的重要工具,也是最便利的工具。

    Traceroute的原理是非常非常的有意思,它收到到目的主机的IP后,首先给目的主机发送一个TTL=1的UDP数据包,而经过的第一个路由器收到这个数据包以后,就自动把TTL减1,而TTL变为0以后,路由器就把这个包给抛弃了,并同时产生 一个主机不可达的ICMP数据报给主机。主机收到这个数据报以后再发一个TTL=2的UDP数据报给目的主机,然后刺激第二个路由器给主机发ICMP数据 报。如此往复直到到达目的主机。这样,traceroute就拿到了所有的路由器IP。

    「每日分享」关于TCP/IP,必须知道的十个知识点

    六、TCP/UDP

    TCP/UDP都是是传输层协议,但是两者具有不同的特性,同时也具有不同的应用场景,下面以图表的形式对比分析。

    「每日分享」关于TCP/IP,必须知道的十个知识点

    面向报文

    面向报文的传输方式是应用层交给UDP多长的报文,UDP就照样发送,即一次发送一个报文。因此,应用程序必须选择合适大小的报文。若报文太长,则IP层需要分片,降低效率。若太短,会是IP太小。

    面向字节流

    面向字节流的话,虽然应用程序和TCP的交互是一次一个数据块(大小不等),但TCP把应用程序看成是一连串的无结构的字节流。TCP有一个缓冲,当应用程序传送的数据块太长,TCP就可以把它划分短一些再传送。

    关于拥塞控制,流量控制,是TCP的重点,后面讲解。

    TCP和UDP协议的一些应用

    「每日分享」关于TCP/IP,必须知道的十个知识点

    什么时候应该使用TCP?

    当对网络通讯质量有要求的时候,比如:整个数据要准确无误的传递给对方,这往往用于一些要求可靠的应用,比如HTTP、HTTPS、FTP等传输文件的协议,POP、SMTP等邮件传输的协议。

    什么时候应该使用UDP?

    当对网络通讯质量要求不高的时候,要求网络通讯速度能尽量的快,这时就可以使用UDP。

    七、DNS

    DNS(Domain Name System,域名系统),因特网上作为域名和IP地址相互映射的一个分布式数据库,能够使用户更方便的访问互联网,而不用去记住能够被机器直接读取的IP数串。通过主机名,最终得到该主机名对应的IP地址的过程叫做域名解析(或主机名解析)。DNS协议运行在UDP协议之上,使用端口号53。

    八、TCP连接的建立与终止

    1.三次握手

    TCP是面向连接的,无论哪一方向另一方发送数据之前,都必须先在双方之间建立一条连接。在TCP/IP协议中,TCP协议提供可靠的连接服务,连接是通过三次握手进行初始化的。三次握手的目的是同步连接双方的序列号和确认号并交换 TCP窗口大小信息。

    「每日分享」关于TCP/IP,必须知道的十个知识点

    第一次握手: 建立连接。客户端发送连接请求报文段,将SYN位置为1,Sequence Number为x;然后,客户端进入SYN_SEND状态,等待服务器的确认;

    第二次握手: 服务器收到SYN报文段。服务器收到客户端的SYN报文段,需要对这个SYN报文段进行确认,设置Acknowledgment Number为x+1(Sequence Number+1);同时,自己自己还要发送SYN请求信息,将SYN位置为1,Sequence Number为y;服务器端将上述所有信息放到一个报文段(即SYN+ACK报文段)中,一并发送给客户端,此时服务器进入SYN_RECV状态;

    第三次握手: 客户端收到服务器的SYN+ACK报文段。然后将Acknowledgment Number设置为y+1,向服务器发送ACK报文段,这个报文段发送完毕以后,客户端和服务器端都进入ESTABLISHED状态,完成TCP三次握手。

    为什么要三次握手?

    为了防止已失效的连接请求报文段突然又传送到了服务端,因而产生错误。

    具体例子:“已失效的连接请求报文段”的产生在这样一种情况下:client发出的第一个连接请求报文段并没有丢失,而是在某个网络结点长时间的滞留了,以致延误到连接释放以后的某个时间才到达server。本来这是一个早已失效的报文段。但server收到此失效的连接请求报文段后,就误认为是client再次发出的一个新的连接请求。于是就向client发出确认报文段,同意建立连接。假设不采用“三次握手”,那么只要server发出确认,新的连接就建立了。由于现在client并没有发出建立连接的请求,因此不会理睬server的确认,也不会向server发送数据。但server却以为新的运输连接已经建立,并一直等待client发来数据。这样,server的很多资源就白白浪费掉了。采用“三次握手”的办法可以防止上述现象发生。例如刚才那种情况,client不会向server的确认发出确认。server由于收不到确认,就知道client并没有要求建立连接。”

    2.四次挥手

    当客户端和服务器通过三次握手建立了TCP连接以后,当数据传送完毕,肯定是要断开TCP连接的啊。那对于TCP的断开连接,这里就有了神秘的“四次分手”。

    「每日分享」关于TCP/IP,必须知道的十个知识点

    第一次分手: 主机1(可以使客户端,也可以是服务器端),设置Sequence Number,向主机2发送一个FIN报文段;此时,主机1进入FIN_WAIT_1状态;这表示主机1没有数据要发送给主机2了;

    第二次分手: 主机2收到了主机1发送的FIN报文段,向主机1回一个ACK报文段,Acknowledgment Number为Sequence Number加1;主机1进入FIN_WAIT_2状态;主机2告诉主机1,我“同意”你的关闭请求;

    第三次分手: 主机2向主机1发送FIN报文段,请求关闭连接,同时主机2进入LAST_ACK状态;

    第四次分手: 主机1收到主机2发送的FIN报文段,向主机2发送ACK报文段,然后主机1进入TIME_WAIT状态;主机2收到主机1的ACK报文段以后,就关闭连接;此时,主机1等待2MSL后依然没有收到回复,则证明Server端已正常关闭,那好,主机1也可以关闭连接了。

    为什么要四次分手?

    TCP协议是一种面向连接的、可靠的、基于字节流的运输层通信协议。TCP是全双工模式,这就意味着,当主机1发出FIN报文段时,只是表示主机1已经没有数据要发送了,主机1告诉主机2,它的数据已经全部发送完毕了;但是,这个时候主机1还是可以接受来自主机2的数据;当主机2返回ACK报文段时,表示它已经知道主机1没有数据发送了,但是主机2还是可以发送数据到主机1的;当主机2也发送了FIN报文段时,这个时候就表示主机2也没有数据要发送了,就会告诉主机1,我也没有数据要发送了,之后彼此就会愉快的中断这次TCP连接。

    为什么要等待2MSL?

    MSL:报文段最大生存时间,它是任何报文段被丢弃前在网络内的最长时间。

    原因有二:

    • 保证TCP协议的全双工连接能够可靠关闭
    • 保证这次连接的重复数据段从网络中消失

    第一点:如果主机1直接CLOSED了,那么由于IP协议的不可靠性或者是其它网络原因,导致主机2没有收到主机1最后回复的ACK。那么主机2就会在超时之后继续发送FIN,此时由于主机1已经CLOSED了,就找不到与重发的FIN对应的连接。所以,主机1不是直接进入CLOSED,而是要保持TIME_WAIT,当再次收到FIN的时候,能够保证对方收到ACK,最后正确的关闭连接。

    第二点:如果主机1直接CLOSED,然后又再向主机2发起一个新连接,我们不能保证这个新连接与刚关闭的连接的端口号是不同的。也就是说有可能新连接和老连接的端口号是相同的。一般来说不会发生什么问题,但是还是有特殊情况出现:假设新连接和已经关闭的老连接端口号是一样的,如果前一次连接的某些数据仍然滞留在网络中,这些延迟数据在建立新连接之后才到达主机2,由于新连接和老连接的端口号是一样的,TCP协议就认为那个延迟的数据是属于新连接的,这样就和真正的新连接的数据包发生混淆了。所以TCP连接还要在TIME_WAIT状态等待2倍MSL,这样可以保证本次连接的所有数据都从网络中消失。

    九、TCP流量控制

    如果发送方把数据发送得过快,接收方可能会来不及接收,这就会造成数据的丢失。所谓流量控制就是让发送方的发送速率不要太快,要让接收方来得及接收。

    利用滑动窗口机制可以很方便地在TCP连接上实现对发送方的流量控制。

    设A向B发送数据。在连接建立时,B告诉了A:“我的接收窗口是 rwnd = 400 ”(这里的 rwnd 表示 receiver window) 。因此,发送方的发送窗口不能超过接收方给出的接收窗口的数值。请注意,TCP的窗口单位是字节,不是报文段。假设每一个报文段为100字节长,而数据报文段序号的初始值设为1。大写ACK表示首部中的确认位ACK,小写ack表示确认字段的值ack。

    「每日分享」关于TCP/IP,必须知道的十个知识点

    从图中可以看出,B进行了三次流量控制。第一次把窗口减少到 rwnd = 300 ,第二次又减到了 rwnd = 100 ,最后减到 rwnd = 0 ,即不允许发送方再发送数据了。这种使发送方暂停发送的状态将持续到主机B重新发出一个新的窗口值为止。B向A发送的三个报文段都设置了 ACK = 1 ,只有在ACK=1时确认号字段才有意义。

    TCP为每一个连接设有一个持续计时器(persistence timer)。只要TCP连接的一方收到对方的零窗口通知,就启动持续计时器。若持续计时器设置的时间到期,就发送一个零窗口控测报文段(携1字节的数据),那么收到这个报文段的一方就重新设置持续计时器。

    十、TCP拥塞控制

    1.慢开始和拥塞避免

    发送方维持一个拥塞窗口 cwnd ( congestion window )的状态变量。拥塞窗口的大小取决于网络的拥塞程度,并且动态地在变化。发送方让自己的发送窗口等于拥塞窗口。

    发送方控制拥塞窗口的原则是:只要网络没有出现拥塞,拥塞窗口就再增大一些,以便把更多的分组发送出去。但只要网络出现拥塞,拥塞窗口就减小一些,以减少注入到网络中的分组数。

    慢开始算法:

    当主机开始发送数据时,如果立即所大量数据字节注入到网络,那么就有可能引起网络拥塞,因为现在并不清楚网络的负荷情况。

    因此,较好的方法是 先探测一下,即由小到大逐渐增大发送窗口,也就是说,由小到大逐渐增大拥塞窗口数值。

    通常在刚刚开始发送报文段时,先把拥塞窗口 cwnd 设置为一个最大报文段MSS的数值。而在每收到一个对新的报文段的确认后,把拥塞窗口增加至多一个MSS的数值。用这样的方法逐步增大发送方的拥塞窗口 cwnd ,可以使分组注入到网络的速率更加合理。

    「每日分享」关于TCP/IP,必须知道的十个知识点

    每经过一个传输轮次,拥塞窗口 cwnd 就加倍。一个传输轮次所经历的时间其实就是往返时间RTT。不过“传输轮次”更加强调:把拥塞窗口cwnd所允许发送的报文段都连续发送出去,并收到了对已发送的最后一个字节的确认。

    另,慢开始的“慢”并不是指cwnd的增长速率慢,而是指在TCP开始发送报文段时先设置cwnd=1,使得发送方在开始时只发送一个报文段(目的是试探一下网络的拥塞情况),然后再逐渐增大cwnd。

    为了防止拥塞窗口cwnd增长过大引起网络拥塞,还需要设置一个慢开始门限ssthresh状态变量。慢开始门限ssthresh的用法如下:

    • 当 cwnd < ssthresh 时,使用上述的慢开始算法。
    • 当 cwnd > ssthresh 时,停止使用慢开始算法而改用拥塞避免算法。
    • 当 cwnd = ssthresh 时,既可使用慢开始算法,也可使用拥塞控制避免算法。

    拥塞避免

    让拥塞窗口cwnd缓慢地增大,即每经过一个往返时间RTT就把发送方的拥塞窗口cwnd加1,而不是加倍。这样拥塞窗口cwnd按线性规律缓慢增长,比慢开始算法的拥塞窗口增长速率缓慢得多。

    「每日分享」关于TCP/IP,必须知道的十个知识点

    无论在慢开始阶段还是在拥塞避免阶段,只要发送方判断网络出现拥塞(其根据就是没有收到确认),就要把慢开始门限ssthresh设置为出现拥塞时的发送 方窗口值的一半(但不能小于2)。然后把拥塞窗口cwnd重新设置为1,执行慢开始算法。

    这样做的目的就是要迅速减少主机发送到网络中的分组数,使得发生 拥塞的路由器有足够时间把队列中积压的分组处理完毕。

    如下图,用具体数值说明了上述拥塞控制的过程。现在发送窗口的大小和拥塞窗口一样大。

    「每日分享」关于TCP/IP,必须知道的十个知识点

    2.快重传和快恢复

    快重传

    快重传算法首先要求接收方每收到一个失序的报文段后就立即发出重复确认(为的是使发送方及早知道有报文段没有到达对方)而不要等到自己发送数据时才进行捎带确认。

    「每日分享」关于TCP/IP,必须知道的十个知识点

    接收方收到了M1和M2后都分别发出了确认。现在假定接收方没有收到M3但接着收到了M4。

    显然,接收方不能确认M4,因为M4是收到的失序报文段。根据 可靠传输原理,接收方可以什么都不做,也可以在适当时机发送一次对M2的确认。

    但按照快重传算法的规定,接收方应及时发送对M2的重复确认,这样做可以让 发送方及早知道报文段M3没有到达接收方。发送方接着发送了M5和M6。接收方收到这两个报文后,也还要再次发出对M2的重复确认。这样,发送方共收到了 接收方的四个对M2的确认,其中后三个都是重复确认。

    快重传算法还规定,发送方只要一连收到三个重复确认就应当立即重传对方尚未收到的报文段M3,而不必 继续等待M3设置的重传计时器到期。

    由于发送方尽早重传未被确认的报文段,因此采用快重传后可以使整个网络吞吐量提高约20%。

    快恢复

    与快重传配合使用的还有快恢复算法,其过程有以下两个要点:

    • 当发送方连续收到三个重复确认,就执行“乘法减小”算法,把慢开始门限ssthresh减半。
    • 与慢开始不同之处是现在不执行慢开始算法(即拥塞窗口cwnd现在不设置为1),而是把cwnd值设置为 慢开始门限ssthresh减半后的数值,然后开始执行拥塞避免算法(“加法增大”),使拥塞窗口缓慢地线性增大。
    「每日分享」关于TCP/IP,必须知道的十个知识点
    原文链接




    展开全文
  • TCPIP协议详解

    万次阅读 多人点赞 2019-04-22 11:13:31
    本博客整理自网络,仅供学习参考,如有侵权,联系删除。... 协议分层 TCP/IP在数据包设计上采用封装和分用的策略,所谓封装就是在应用程序在发送数据的过程中,每一层都增加一些首部信息,这些信息用于和接收端同...

    本博客整理自网络,仅供学习参考,如有侵权,联系删除。邮箱:rom100@163.com。 

    协议分层

    TCP/IP在数据包设计上采用封装和分用的策略,所谓封装就是在应用程序在发送数据的过程中,每一层都增加一些首部信息,这些信息用于和接收端同层次进行沟通,例如当数据从应用程序发送到以太网过程中数据逐层加工的示意图如下所示: 


     

    1.应用层

    应用层做为 TCP/IP 协议的最高层级,对于我们移动开发来说,是接触最多的。

    运行在TCP协议上的协议:
    HTTP(Hypertext Transfer Protocol,超文本传输协议),主要用于普通浏览。
    HTTPS(Hypertext Transfer Protocol over Secure Socket Layer, or HTTP over SSL,安全超文本传输协议),HTTP协议的安全版本。
    FTP(File Transfer Protocol,文件传输协议),由名知义,用于文件传输。
    POP3(Post Office Protocol, version 3,邮局协议),收邮件用。
    SMTP(Simple Mail Transfer Protocol,简单邮件传输协议),用来发送电子邮件。
    TELNET(Teletype over the Network,网络电传),通过一个终端(terminal)登陆到网络。
    SSH(Secure Shell,用于替代安全性差的TELNET),用于加密安全登陆用。
    运行在UDP协议上的协议:
    BOOTP(Boot Protocol,启动协议),应用于无盘设备。
    NTP(Network Time Protocol,网络时间协议),用于网络同步。
    DHCP(Dynamic Host Configuration Protocol,动态主机配置协议),动态配置IP地址。
    其他:
    DNS(Domain Name Service,域名服务),用于完成地址查找,邮件转发等工作(运行在TCP和UDP协议上)。
    ECHO(Echo Protocol,回绕协议),用于查错及测量应答时间(运行在TCP和UDP协议上)。
    SNMP(Simple Network Management Protocol,简单网络管理协议),用于网络信息的收集和网络管理。
    ARP(Address Resolution Protocol,地址解析协议),用于动态解析以太网硬件的地址。

    2.传输层

    传输层提供了两种到达目标网络的方式:


    (1)用户数据报协议UDP:

    只提供了基本的错误检测,是一个无连接的协议。
    特点:把数据打包,数据大小有限制(64k),不建立连接,速度快,但可靠性低。


    (2)传输控制协议TCP:

    提供了完善的错误控制和流量控制,能够确保数据正常传输,是一个面向连接的协议。
    特点:建立连接通道,数据大小无限制速度慢,但是可靠性高。由于传输层涉及的东西比较多,比如端口,Socket等。

    TCP三次握手

    第一次握手:Client将标志位SYN置为1,随机产生一个值seq=J,并将该数据包发送给Server,Client进入SYN_SENT状态,等待Server确认。

    第二次握手:Server收到数据包后由标志位SYN=1知道Client请求建立连接,Server将标志位SYN和ACK都置为1,ack=J+1,随机产生一个值seq=K,并将该数据包发送给Client以确认连接请求,Server进入SYN_RCVD状态。

    第三次握手:Client收到确认后,检查ack是否为J+1,ACK是否为1,如果正确则将标志位ACK置为1,ack=K+1,并将该数据包发送给Server,Server检查ack是否为K+1,ACK是否为1,如果正确则连接建立成功,Client和Server进入ESTABLISHED状态,完成三次握手,随后Client与Server之间可以开始传输数据了。

    简单来说,就是:

    1):建立连接时,客户端发送SYN包(SYN=i)到服务器,并进入到SYN-SEND状态,等待服务器确认

    2):服务器收到SYN包,必须确认客户的SYN(ack=i+1),同时自己也发送一个SYN包(SYN=k),即SYN+ACK包,此时服务器进入SYN-RECV状态

    3):客户端收到服务器的SYN+ACK包,向服务器发送确认报ACK(ack=k+1),此包发送完毕,客户端和服务器进入ESTABLISHED状态,完成三次握手,客户端与服务器开始传送数据。

    TCP四次挥手

    由于TCP连接时全双工的,因此,每个方向都必须要单独进行关闭,这一原则是当一方完成数据发送任务后,发送一个FIN来终止这一方向的连接,收到一个FIN只是意味着这一方向上没有数据流动了,即不会再收到数据了,但是在这个TCP连接上仍然能够发送数据,直到这一方向也发送了FIN。首先进行关闭的一方将执行主动关闭,而另一方则执行被动关闭,上图描述的即是如此。

    第一次挥手:Client发送一个FIN,用来关闭Client到Server的数据传送,Client进入FIN_WAIT_1状态。

    第二次挥手:Server收到FIN后,发送一个ACK给Client,确认序号为收到序号+1(与SYN相同,一个FIN占用一个序号),Server进入CLOSE_WAIT状态。

    第三次挥手:Server发送一个FIN,用来关闭Server到Client的数据传送,Server进入LAST_ACK状态。

    第四次挥手:Client收到FIN后,Client进入TIME_WAIT状态,接着发送一个ACK给Server,确认序号为收到序号+1,Server进入CLOSED状态,完成四次挥手。

    为什么建立连接是三次握手,而关闭连接却是四次挥手呢?

           这是因为服务端在LISTEN状态下,收到建立连接请求的SYN报文后,把ACK和SYN放在一个报文里发送给客户端。而关闭连接时,当收到对方的FIN报文时,仅仅表示对方不再发送数据了但是还能接收数据,己方也未必全部数据都发送给对方了,所以己方可以立即close,也可以发送一些数据给对方后,再发送FIN报文给对方来表示同意现在关闭连接,因此,己方ACK和FIN一般都会分开发送。

    3.网络层

    IP地址由两部分组成,即网络地址和主机地址,二者是主从关系:

    (1)网络号 net-id,它标志主机(或路由器)所连接到的网络,网络地址表示其属于互联网的哪一个网络

    (2)主机号 host-id,它标志该主机(或路由器),主机地址表示其属于该网络中的哪一台主机。


     

    4.网络接口层

     

     

    协议拆分

           类似地,许多应用进程使用TCP或UDP传送数据,则需要在TCP段或UDP数据报首部定义一个应用程序标识符。TCP和UDP都使用一个16位的端口号来标识不同的应用程序,TCP和UDP把“源端口号”和“目的端口号”分别存人TCP段首部和UDP数据报首部。网络接口分别发送和接收IP、ARP、RARP的数据,同理,也必须在以太网(假定物理网络是一个以太网)的首部加入一个字段,用来说明是哪个协议的数据。为此,以太网帧首部定义了一个16位的“类型”字段。当接收方(也称目的主机)收到一个以太网帧时,数据就开始在协议栈中自下而上传送。各层协议利用报文首部所携带的协议控制信息做相应的处理,然后去掉各层协议数据单元的首部,将封装的数据交给上层协议。每层协议都要检查协议首部中的协议标识,以确定让哪一个协议接收数据,这个过程称为拆封,如上图所示。

    局域网数据传输

           任何两个对等层(peerlayer),例如传输层、网际层、网络接口层之间的通信,如同上图中标识的一样,好像是将数据通过水平虚线直接传递给对方,这就是所谓的对等层之间的通信。实际上,协议就是在两个对等层之间传递数据时的各种规定。由此可以这样认为:实际通信是按垂直方向进行的,层与层之间经过封装和拆封这样的操作实现物理通信。但是逻辑上,却是在水平方向上利用协议进行的对等层通信。

    广域网数据传输


          应用层和传输层使用端到端(end-to-end)协议,路由器中没有这两层协议,只有端系统才有这两层协议。网际层是逐跳(hop-by-hop)协议,端系统和路由器都有网际层协议。一个路由器具有两个或多个网络接口,这样才能连接两个或多个网络。互联网的目的之一是在应用程序中屏蔽所有的物理网络细节。在上图中,应用层不需要关心一个端系统是在以太网上还是在令牌环网上,它们通过路由器进行通信。随着不同类型物理网络的增加,互联网的规模变得越来越大,也需要增加路由器,但是应用层仍然是一样的。

    展开全文
  • 图解TCPIP-TCPIP必备

    2020-07-30 23:31:36
    资源名称:图解TCPIP -TCPIP必备资源截图: 资源太大,传百度网盘了,链接在附件中,有需要的同学自取。
  • 关于TCP/IP的一些简单概述 T C P / I P起源于6 0年代末美国政府资助的一个分组交换网络研究项目,到 9 0年代已发展成为计 算机之间最常应用的组网形式。它是一个真正的开放系统,因为协议族的定义及其多种实现 可以...

    关于TCP/IP的一些简单概述

    T C P / I P起源于6 0年代末美国政府资助的一个分组交换网络研究项目,到 9 0年代已发展成为计 算机之间最常应用的组网形式。它是一个真正的开放系统,因为协议族的定义及其多种实现 可以不用花钱或花很少的钱就可以公开地得到。它成为被称作“全球互联网”或“因特网 ( I n t e r n e t )”的基础

    1.1 分层

    T C P / I P通常被认 为是一个四层协议系统:

    在这里插入图片描述

    每一层负责不同的功能:

    1. 链路层,有时也称作数据链路层或网络接口层, 通常包括操作系统中的设备驱动程序和计算机 中对应的网络接口卡。它们一起处理与电缆(或其他任何传输媒介)的物理接口细节。

    2. 网络层,有时也称作互联网层,处理分组在网络中的活动,例如分组的选路。在 T C P / I P协议族中,网络层协议包括 I P协议(网际协议),I C M P协议(I n t e r n e t互联网控 制报文协议),以及I G M P协议(I n t e r n e t组管理协议)。

    3 ) 运输层主要为两台主机上的应用程序提供端到端的通信。在 T C P / I P协议族中,有两个 互不相同的传输协议:T C P(传输控制协议)和U D P(用户数据报协议)。 T C P为两台主机提供高可靠性的数据通信。它所做的工作包括把应用程序交给它的数据分 成合适的小块交给下面的网络层,确认接收到的分组,设置发送最后确认分组的超时时钟 等。由于运输层提供了高可靠性的端到端的通信,因此应用层可以忽略所有这些细节。 而另一方面,U D P则为应用层提供一种非常简单的服务。它只是把称作数据报的分组 从一台主机发送到另一台主机,但并不保证该数据报能到达另一端。任何必需的可靠 性必须由应用层来提供。 这两种运输层协议分别在不同的应用程序中有不同的用途,这一点将在后面看到。

    4 ) 应用层负责处理特定的应用程序细节。几乎各种不同的 T C P / I P实现都会提供下面这些

    通用的应用程序:

    • Telnet 远程登录。

    • FTP 文件传输协议。

    • SMTP 简单邮件传送协议。

    • SNMP 简单网络管理协议。

    假设在一个局域网( L A N)如以太网中有两台主机,二者都运行 F T P协议:

    在这里插入图片描述

    大多数的网络应用程序都 被设计成客户—服务器模式。服务器为客户提供某种服务,在本例中就是访问服务器所在主 机上的文件。在远程登录应用程序 Te l n e t中,为客户提供的服务是登录到服务器主机上。

    顶层与下三层之间还有另一个关键的不同之处。应用层关心的是应用程序的 细节,而不是数据在网络中的传输活动。下三层对应用程序一无所知,但它们要处理所有的 通信细节。

    F T P是一种应用层协议, T C P是一种运输层协 议,I P是一种网络层协议,而以太网协议则应用于链路层上。 T C P / I P协议族是一组不同的协 议组合在一起构成的协议族。尽管通常称该协议族为 T C P / I P,但T C P和I P只是其中的两种协 议而已(该协议族的另一个名字是 I n t e r n e t协议族(Internet Protocol Suite))。

    人们又把多个网络连在一起形成一个网络的网络,或称作互连网 ( i n t e r n e t )。一个互连 网就是一组通过相同协议族互连在一起的网络。

    构造互连网最简单的方法是把两个或多个网络通过路由器进行连接。它是一种特殊的用 于网络互连的硬件盒。这些盒子也称作I P路由器(IP Router),但我们这里使用路由器( R o u t e r )这个术语。 从历史上说,这些盒子称作网关( g a t e w a y),在很多T C P / I P文献中都使用这个术语。 现在网关这个术语只用来表示应用层网关:一个连接两种不同协议族的进程(例如, TCP/IP和IBM的SNA),它为某个特定的应用程序服务(常常是电子邮件或文件传输)。

    在这里插入图片描述
    在T C P / I P协议族中,网络层 I P提供的是一种不可靠的服务。也就是说,它只是尽可能快 地把分组从源结点送到目的结点,但是并不提供任何可靠性保证。而另一方面, T C P在不可 靠的I P层上提供了一个可靠的运输层。为了提供这种可靠的服务, T C P采用了超时重传、发 送和接收端到端的确认分组等机制。由此可见,运输层和网络层分别负责不同的功能。

    **连接网络的另一个途径是使用网桥。**网桥是在链路层上对网络进行互连,而路由器则是 在网络层上对网络进行互连。网桥使得多个局域网( L A N)组合在一起,这样对上层来说就 好像是一个局域网。 TCP /IP倾向于使用路由器而不是网桥来连接网络

    1.2 TCP/IP的分层

    在T C P / I P协议族中,有很多种协议。
    在这里插入图片描述

    T C P和U D P是两种最为著名的运输层协议,二者都使用 I P作为网络层协议。 虽然T C P使用不可靠的 I P服务,但它却提供一种可靠的运输层服务。

    I P是网络层上的主要协议,同时被 T C P和U D P使用。T C P和U D P的每组数据都通过端系统 和每个中间路由器中的I P层在互联网中进行传输。

    I C M P是I P协议的附属协议。I P层用它来与其他主机或路由器交换错误报文和其他重要信息。

    I G M P是I n t e r n e t组管理协议。它用来把一个 U D P数据报多播到多个主机。

    A R P(地址解析协议)和R A R P(逆地址解析协议)是某些网络接口(如以太网和令牌环 网)使用的特殊协议,用来转换 I P层和网络接口层使用的地址。

    1.3 互联网的地址IP地址

    互联网上的每个接口必须有一个唯一的 I n t e r n e t地址(也称作 I P地址)。I P地址长32 bit。 I n t e r n e t地址并不采用平面形式的地址空间,如 1、2、3等。

    I P地址具有一定的结构,有五类不同 的互联网地址格式:

    在这里插入图片描述
    在这里插入图片描述

    由于互联网上的每个接口必须有一个唯一的 I P地址,因此必须要有一个管理机构为接入互 联网的网络分配I P地址。这个管理机构就是互联网络信息中心( Internet Network Information C e n t r e),称作I n t e r N I C。I n t e r N I C只分配网络号。主机号的分配由系统管理员来负责。

    ion C e n t r e),称作I n t e r N I C。I n t e r N I C只分配网络号。主机号的分配由系统管理员来负责。

    在这里插入图片描述

    展开全文
  • TCPIP协议完整版

    2020-07-30 23:32:06
    TCPIP协议---------------------TCPIP协议------------------------TCPIP协议
  • TCPIP详解[pdf]

    2020-03-21 23:30:43
    关于TCP/IP基础的讲解,TCP/IP是网络学习的基础,但是很多书上介绍的都不全面,压缩文件里包含了全面且详细的TCP/IP详解,共分三卷,每一卷里又有很多电子书,可以说学TCP/ip足够用了
  • TCPIP学习笔记一(概述一)

    千次阅读 2019-03-09 13:26:26
    一、概述 一、分层 1、网络协议通常分不同层次进行开发,每一层分别负责不同的通信功能。 2、TCP/IP通常被认为是一个四层协议系统: ...1)、链路层,有时候也被称作数据链路层或网络接口层,通常包括操作系统中的...
  • tcpip

    千次阅读 2018-12-30 15:30:09
    三次握手
  • TCP 详解

    万次阅读 多人点赞 2018-06-20 00:30:57
    上回说到 UDP 协议, 与之对应的便是 TCP 协议 TCP协议 TCP协议全称: 传输控制协议, 顾名思义, 就是要对数据的传输进行一定的控制....先来看看它的报头 我们来分析分析每部分的含义和作用 ...源端口号/目的端口号: ...
  • 17.TCPIP各层的协议

    千次阅读 2018-04-23 13:55:07
    教程书上虽然介绍了这些协议,但是就单个协议分别介绍的,很容易忘了这个协议属于那一层,以及属于底层哪个协议。上图TCP/IP各层的协议很多,一张图就可以记住了。应用层协议0. 运行 在TCP\UDP之间NFS,Network ...
  • matlab之使用TCP/IP协议进行通信

    万次阅读 2018-07-26 15:51:19
    matlab的tcpip函数做了很好的封装,通过自带的示例我们可以清楚看到该如何使用。 %Start a TCP/IP echo server and create a TCPIP object. echotcpip('on',4012) t = tcpip('localhost',4012);...
  • Android 网络调试 adb tcpip 开启方法

    万次阅读 2014-05-17 08:13:48
    1.连接USB数据线,打开usb调试,使用windows的“运行”命令行方式:(此方法需配置adb环境变量,...adb tcpip 5555 (端口号) adb connect 192.168.1.199 (Android设备IP地址) adb usb 使用回usb调试 2.无需数据
  • 《TCP/IP详解 卷1:协议》在线阅读

    万次阅读 多人点赞 2018-08-03 08:45:17
    比较经典的一本书籍,中文版本。手机上如果阅读不了,将浏览器UA 更改为电脑即可 http://www.52im.net/topic-tcpipvol1.html?mobile=no
  • 前几天因为无法跨网段访问MySQL数据库,所以无意间看到一篇关于因为NetBIOS被禁用而导致无法远程连接的文章 解决方案: 输入命令:net winsock reset catalog...
  • tcpip_input() -> ethernet_input() -> ip_input() 调用流程:  当网卡收到数据后,调用数据帧接收函数进行数据帧的接收,最后通过(*input)()函数传至协议栈(实际是netif->input,有一层封装)。 在添加...
  • 今天一早打开电脑,杀毒软件就给了警报,说tcpip.sys被病毒感染,基于对avast的信任,下意识的就点了删除文件。点完就有点儿小后悔,万一出事儿怎么办,貌似是在driver目录下的,顿时就有一种不祥的预感,fuck,果然...
  • matlab tcpip代码

    千次阅读 2017-08-29 16:06:39
    t = tcpip('sonytekawg.yourdomain.com',4000); %创建缓存区 set(t,'OutputBufferSize',3000) %连接 fopen(t) %设置读写 set(t,'ByteOrder','littleEndian') %生成...
  • TCPIP三次握手-最简说明

    千次阅读 2018-09-03 16:47:17
    第一次 第一次握手:建立连接时,客户端发送syn包(syn=j)到服务器,并进入SYN_SENT状态,等待服务器确认;SYN:同步序列编号(Synchronize Sequence Numbers)。 第二次 第二次握手:服务器收到syn包,必须确认...
  • (转)Ws2tcpip.h

    万次阅读 2011-12-22 14:43:44
    设置或获取套接字选项在 C/C++ Winsock 应用程序针对 Windows NT、 Windows 2000、 Windows 95 或 Windows 98 中 IPPROTO_IP 级别时, 程序项目中包括正确的标头和库文件至关重要。 如果标头和库文件不正确地匹配,...
1 2 3 4 5 ... 20
收藏数 38,149
精华内容 15,259
关键字:

tcpip