TCP提供客户和服务器的连接,跨越连接交换数据,然后终止连接。
    TCP提供可靠性。TCP向另一端发送数据要求对方返回一个确认,如果确认没有收到,TCP将自动重传并等待更长的时间。数次重传失败后TCP才放弃。
    TCP通过给所发送的数据的每一个字节关联一个序列号进行排序。如果发送的分节非顺序到达,接收方的TCP会根据它们的序列号重新排序,再把结果数据传递给应用进程。如果TCP接收到重复的数据,它可以判断数据是重复的,从而把它丢弃掉。
    TCP提供流量控制。TCP总是告诉对方它能够接收多少字节的数据,这称为通告窗口。
    TCP的连接是全双工的。因此TCP必须跟踪每个方向数据流的状态信息,如序列号和通告窗口的大小。
    TCP三次握手:
    --> SYN J
    <-- SYN K,ACK J+1
    --> ACK K+1
    TCP发送的SYN中带有MSS选项是通知对方它能接受的每个TCP分节中的最大数据量。
    TCP连接的终止:
    --> FIN M
    <-- ACK M+1
    <-- FIN N
    --> ACK N+1
    步骤二和步骤三之间可以有从执行被动关闭端到执行主动关闭端的数据流,这称为半关闭。
    通常是客户端执行主动关闭,但某些协议如HTTP是服务器执行主动关闭。
    如果把TCP换成UDP,TCP提供给应用程序的可靠性将消失,而把传输层(TCP)的一大堆细节推给UDP应用程序。TCP提供的用色控制也得由UDP应用程序处理。但是UDP避免了TCP建立连接和终止连接的额外开销。
    众所周知的端口0-1023由IANA分配和控制。
    经注册的端口1024-49151不受IANA的控制,但由IANA登记并提供它们的使用情况清单,以方便整个群体。
    49152-65535是动态的端口或私用端口,IANA不管这些端口,称为临时端口。

    主动关闭的那端进入TIME_WAIT之后留在该状态的持续时间是最长生命周期MSL的两倍。MSL是IP数据报能在互联网中生存的最长时间。这个时间是有限的,每个数据报有一个8位的字段称为跳限,最大值为255.尽管这是一个跳数限制而不是真正的时间限制,我们仍然需要假设:具有最大跳限的分组不能超过MSL秒还继续存在。
    分组在路由异常时经常“迷途”。某个路由崩溃或两个路由间的链路可能断开时,路由协议需要花数秒或数分钟才能稳定并找出另一条通路,在这段时间可能产生路由循环。假设TCP超时重传,重传分组可能选择另一条路径到达目的地,但是迷途的分组最终也可能到达目的地。
    存在TIME_WAIT状态的两个理由:
    1.假设ACK丢失,服务器将重发FIN,因此客户端必须维护状态信息以允许它重发最终的ACK。
    2.允许老的重复分节在网络中消逝。如果关闭连接后的某个时候又重新简历起相同的IP地址和端口号的TCP连接,老的连接的重复分组可能被误解为属于同一连接的化身。
    最大传输单元MTU由硬件规定,两台主机之间的路径上的最小MTU称为路径MTU。当一个IP数据报将从某个接口发出时,如果它的大小超过相应链路的MTU,IPv4和IPv6都将执行分片,各片段到达目的地之前不会被重组。IPv4主机对其产生的数据报执行分片,IPv4路由器对其转发的数据报也执行分片。
    MSS经常设置成MTU减去IP和TCP头部的固定长度。
    每一个TCP套接口有一个发送缓冲区,我们可以用SO_SNDBUF套接口选项来改变这一缓冲区的大小。当应用进程调用write时,内核从应用进程的缓冲区中拷贝所有数据到套接口的发送缓冲区……

Posted on 2011-11-27 10:51  SomethingReview  阅读(140)  评论(0编辑  收藏  举报