zoukankan      html  css  js  c++  java
  • 计算机网络之传输层 下(TCP)

    1.  TCP的特点

       特点:它是一个点到点的通信机制,只能有一个发送方和一个接收方;它提供是一个可靠的,按序的字节流机制;使用流水线机制,通过拥塞控制和流量控制的机制设置窗口尺寸;发送方和接收方都有缓存;它是一个全双工,能双向传输数据的面向连接的通信,通信双方必须在发送数据之前建立连接,连接状态只能在连接的两端维护,不能在沿途的结点维护状态。

    2.  TCP的段结构

       

       源地址端口,目的端口地址;

       序号(TCP传输保证连接性,发送的每个字节都要编上号),确认号(接收方期望从对方接受的字节编号。如果报文段的接收方成功的接受了对方发过来的编号x的字节,那么返回x+1作为确认号,确认号可以和数据捎带一起发送。)  

       控制:定义了6中不同的控制位或者标志位:URG:紧急数据标志位,ACK:确认标志位,PSH:请求推送位,接收端应尽快把数据传送给应用层,RST:连接复位,通常,如果TCP收到的一个分段明显不属于该主机的任何一个连接,则向远程发送一个复位包,SYN:建立连接,让连接双方同步序列号,FIN:释放连接

       检验和:TCP的使用检验和是强制性的,UDP使用检验和是可选的。在计算检验和是报文段要附加相同的伪首部,对于TCP来说伪首部的协议字段的值是6

       序列号和ACK

       

    3.  TCP可靠数据传输

       TCP在IP层提供的不可靠服务基础上实现的可靠数据传输,使用流水线机制,累积确认机制,单一的重传计时器。触发重传的事件:超时,收到重复的ACK。

       那么如何设置定时器的超时时间?

       

    4.  TCP发送方的事件

       

    5.  TCP接收方时间

       收到 一个连续的段,等待最多500ms,看有没有下一个段,否则发送ACK,

       收到乱序的段,立刻发送重复的ACK。

    6.  快速重传机制

       TCP实现中,如果发生超时时间,超时时间间隔会重新设置,即将超时时间间隔加倍,导致其很大,重发丢失分组的时间会等待很久的时间。  

       可以通过重复ACK检测检测分组丢失,Sender收到同一个数据的3个ACK,则假定该数据之后的段已经丢失,即在定时器超时之前进行重传。

    7.  TCP流量控制

       接收方为TCP连接分配buffer

       

       如果上层应用处理buffer中的数据较慢,发送方在这个机制下发送方不会传输的太多太快以至于淹没接收方(buffer溢出)

       实现的时候就是Received在Segment的头部字段中将RcvWindow告诉Sender,Sender限制自己发送的但还没收到ACk的数据不超过接收方的空闲RECWindow的尺寸。  

       但是如果Received告知Sender RcvWindow=0是,发送方仍然可以发送一个很少的数据段,从而更新RcvWindow的值

    8.  TCP连接管理

       1.TCP的三次握手

       

       step1:建立连接。客户端发送连接请求报文段,将SYN位置为1,Sequence Number为x(随机数);

       step2:服务器收到SYN报文段。服务器收到客户端的SYN报文段,需要对这个SYN报文段进行确认,设置ACK为x+1(Sequence Number+1);同时,自己自己还要发送SYN请求信息,将SYN位置为1,Sequence Number为y;

       step3:客户端收到服务器的SYN+ACK报文段。然后将ACK设置为y+1,向服务器发送ACK报文段,

       为什么需要三次握手?为了防止已失效的连接请求报文段突然又传送到了服务端,因而产生错误。

       2.TCP的四次挥手

       

       

       为什需要四次挥手?

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

       在TCP的三次握手中,后采用随机产生的初始化序列号进行请求,这样做主要是出于网络安全的因素着想。如果不是随机产生初始序列号,黑客将会以很容易的方式获取到你与其他主机之间通信的初始化序列号,并且伪造序列号进行攻击,这已经成为一种很常见的网络攻击手段。

    10.  TCP的TIME_WAIT状态和CLOSE_WAIT状态

       1.为什么存在TIME_WAIT状态:可靠的实现TCP的全双工连接的终止,允许老的重复segment在网络中消逝。

       2.TIME_WAIT为什么要等待2MSL:等待2MSL时间主要目的是怕最后一个ACK包对方没收到,那么对方在超时后将重发第三次握手的FIN包,主动关闭端接到重发的FIN包后可以再发一个ACK应答包。在TIME_WAIT状态时两端的端口不能使用,要等到2MSL时间结束才可继续使用。所以当连接处于2MSL等待阶段时任何迟到的报文段都将被丢弃,让所有本次连接的报文段在网络中消失。    

       3.被动关闭的一方收到FIN包后,协议层回复ACK;然后被动关闭的一方,进入CLOSE_WAIT状态。如果服务器程序TCP连接一直保持在CLOSE_WAIT状态,那么只有一种情况,就是在对方关闭连接之后服务器程序自己没有进一步发出ack信号。换句话说,就是在对方连接关闭之后,程序里没有检测到,或者程序压根就忘记了这个时候需要关闭连接,于是这个资源就一直 被程序占着。

  • 相关阅读:
    十大开源CRM
    编码转换与网址解码
    1、ADO.NET相关对象一句话介绍
    接口与抽象类对比
    C#中的文件下载问题
    在WinForm下获取粘贴板中HTML格式的数据
    Exchange学习
    用Log Explorer恢复数据的基本操作
    iframe的问题
    再发一个C#版的日历
  • 原文地址:https://www.cnblogs.com/jkzr/p/10076899.html
Copyright © 2011-2022 走看看