zoukankan      html  css  js  c++  java
  • 理解TCP/IP协议

    引用自:http://www.cnblogs.com/yuilin/archive/2011/11/03/2234304.html

    TCP/IP协议是Transmission Control Protocol/Internet Protocol的简写,中译名为传输控制协议/因特网互联协议。

    单从TCP/IP协议这个名称看,好多人误以为它是一个协议。其实TCP/IP并不是一个协议,而是一个协议族,这个族里面括很多协议,其中比较主要的是TCP协议和IP协议,所以简称为TCP/IP协议。

    TCP/IP协议由4层组成,从下到上分别是,网络接口层,网络层,传输层,应用层

    这里有的朋友可能会有疑问,开放系统互联参考模型(OSI)不是有7层么,这个TCP/IP协议怎么只有4层?其实这个是不矛盾的,因为OSI参考模型是一个理论模型,而TCP/IP是在实际应用中产生的。

    TCP/IP也遵守OSI,但根据实际情况进行了一些变通,它觉得分成7个层次不够简单高效,有些层次做的事情是可以合并到一个层的。于是TCP/IP将OSI中的应用层、表示层、回话层合并为了应用层

    将OSI中的数据链路层、物理层合并为了网络接口层

    TCP/IP结构对应OSI结构
    TCP/IPOSI
    应用层 应用层
    表示层
    会话层
    传输层 传输层
    网络层 网络层
    网络接口层 数据链路层
    物理层

    TCP/IP个层包括的协议如下:

    网络接口层:

    Ethernet 802.3、Token Ring 802.5、X.25、Frame relay、HDLC、PPP ATM 等。

    网络层:

    IP(Internet Protocol)协议、ICMP(Internet Control Message Protocol)控制报文协议、ARP(Address Resolution Protocol)地址转换协议、RARP(Reverse ARP)反向地址转换协议。

    传输层:

    传输控制协议TCP(Transmission Control Protocol)和用户数据报协议UDP(User Datagram protocol)

    应用层:

    TFTP,HTTP,SNMP,FTP,SMTP,DNS,RIP,Telnet

    网上有人说TCP/IP是传输层协议,由此可见这句话是错误的。

    首先简单介绍一下TCP三次握手

        在TCP/IP协议中,TCP协议提供可靠的连接服务,采用三次握手建立一个连接。

    第一次握手:建立连接时,客户端发送syn包(syn=j)到服务器,并进入SYN_SEND状态,等待服务器确认;

    第二次握手:服务器收到syn包,必须确认客户的SYN(ack=j+1),同时自己也发送一个SYN包(syn=k),即SYN+ACK包,此时服务器 进入SYN_RECV状态;

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

    通过这样的三次握手,客户端与服务端建立起可靠的双工的连接,开始传送数据。

    三次握手的最主要目的是保证连接是双工的,可靠更多的是通过重传机制来保证的。

    为了保证服务端能收接受到客户端的信息并能做出正确的应答而进行前两次(第一次和第二次)握手,为了保证客户端能够接收到服务端的信息并能做出正确的应答而进行后两次(第二次和第三次)握手。

    TCP协议提供可靠的连接服务,采用三次握手建立一个连接。以下步骤概述了通常情况下客户端计算机请求与服务器计算机简历TCP的过程:

    TCP三次握手图解

    TCP图解3次握手

    TCP图解3次握手

    • 1. 客户端向服务器发送一个SYN置位的TCP报文,其中包含连接的初始序列号x和一个窗口大小(表示客户端上用来存储从服务器发送来的传入段的缓冲区的大小)。
    • 2. 服务器收到客户端发送过来的SYN报文后,向客户端发送一个SYN和ACK都置位的TCP报文,其中包含它选择的初始序列号y、对客户端的序列号的确认x+1和一个窗口大小(表示服务器上用来存储从客户端发送来的传入段的缓冲区的大小)。
    • 3. 客户端接收到服务器端返回的SYN+ACK报文后,向服务器端返回一个确认号y+1ACK报文,一个标准的TCP连接完成。

    TCP关闭连接,四次握手图解

    TCP断开连接-四次握手图解

    TCP断开连接-四次握手图解

      几点注意事项:
    • 默认情况下,当调用close( or closesocket)时,如果发送缓冲中还有数据,TCP会继续把数据发送完。
    • 发送了FIN只是表示这端不能继续发送数据(应用层不能再调用send发送),但是还可以接收数据。
    • 被动关闭端可能会将ACK和FIN合到一起发送,所以这也算不上严格的四次握手—四个报文段。
    • 应用层如何知道对端关闭?通常,在最简单的阻塞模型中,当你调用recv时,如果返回0,则表示对端
      关闭。在这个时候通常的做法就是也调用close,那么TCP层就发送FIN,继续完成四次握手。
    • 关 闭TCP连接的最后微妙之处在于对Time-Wait状态的需要。TCP规范要求在终止连接时,两端的关闭握手都完成后,至少要有一个套接字在Time- Wait状态保持一段时间。这个要求的提出是由于消息在网络中传输时可能延迟。如果在连接两端都完成了关闭握手后,它们都移除了其底层数据结构,而此时在 同样一对套接字地址之间又立即建立了新的连接,那么前一个连接在网络上传输时延迟的消息就可能在新连接建立后到达。由于其包含了相同的源地址和目的地址, 旧消息就会被错误地认为是属于新连接的,其包含的数据就可能被错误地分配到应用程序中。

     

     

  • 相关阅读:
    Java Clone
    Java Clone
    Java Clone
    Java Clone
    js数组去重
    js数组去重
    js数组去重
    js数组去重
    bat修改hosts文件
    3个赚钱思路和案例,都是暴利赚钱项目,最后一个你肯定见到过
  • 原文地址:https://www.cnblogs.com/langqi250/p/2756327.html
Copyright © 2011-2022 走看看