zoukankan      html  css  js  c++  java
  • TCP/IP协议分层

    TCP/IP协议从上而下,层层包装:

    (1)应用层:HTTP

    (2)传输层:TCP和UDP

    (3)网络层(网际互联层):IP

    (4)数据连接层(网络接入层):为IP模块发送和接收IP数据报。

    (5)硬件层

    TCP中两个序号和三个标志位的含义:

    seq:sequence number的缩写,表示所传数据的序号。TCP传输时,每一个字节都有一个序号,发送数据时会将数据的第一个序号发送给对方,接收方会按序号检查是否接受完整,如果没有接受完整,就需要重新发送,保证数据的完整性。

    ack:acknoledgement number的缩写,表示确认号。接收端用它来给发送端反馈已经成功接收到的数据信息的。它的值为希望接收的下一个数据包起始序号,也就是ack值所代表的序号前面的数据已经成功接受到了。

    ACK:确认位,只有ACK=1时,ack才起作用。正常通信时,ACK=1,第一次发起请求是因为没有需要确认接收的数据,所以ACK为0.

    SYN:同步位u,用于在建立连接时同步序号。刚开始建立连接时并没有历史接收的数据,所以ack也无法设置,这时按照正常的机制就无法运行了,SYN的作用就是来解决这个问题的。当接收端接收到SYN=1的报文时,就会直接将ack设置为接收到seq+1的值,注意这里的值并不是校验后设置的,而是根据SYN直接设置的,这样正常的机制就可以运行了,所以SYN叫同步位。SYN在前两次握手时都为1,这是因为通信的双方的ack都需要设置一个初始值。

    FIN:终止位,用于在数据传输完毕后释放连接。

    三次握手:所谓三次握手(Three-Way Handshake)即建立TCP连接,就是指建立一个TCP连接时,需要客户端和服务端总共发送3个包以确认连接的建立。在socket编程中,这一过程由客户端执行connect来触发,整个流程如下图所示:


      

     (1)第一次握手:Client将标志位SYN置为1,随机产生一个值seq=J,并将该数据包发送给Server,Client进入SYN_SENT状态,等待Server确认。
      (2)第二次握手:Server收到数据包后由标志位SYN=1知道Client请求建立连接,Server将标志位SYN和ACK都置为1,ack=J+1,随机产生一个值seq=K,并将该数据包发送给Client以确认连接请求,Server进入SYN_RCVD状态。
      (3)第三次握手:Client收到确认后,检查ack是否为J+1,ACK是否为1,如果正确则将标志位ACK置为1,ack=K+1,并将该数据包发送给Server,Server检查ack是否为K+1,ACK是否为1,如果正确则连接建立成功,Client和Server进入ESTABLISHED状态,完成三次握手,随后Client与Server之间可以开始传输数据了。

    四次挥手:所谓四次挥手(Four-Way Wavehand)即终止TCP连接,就是指断开一个TCP连接时,需要客户端和服务端总共发送4个包以确认连接的断开。在socket编程中,这一过程由客户端或服务端任一方执行close来触发,整个流程如下图所示:

     (1)第一次挥手:Client发送一个FIN,用来关闭Client到Server的数据传送,Client进入FIN_WAIT_1状态。
      (2)第二次挥手:Server收到FIN后,发送一个ACK给Client,确认序号为收到序号+1(与SYN相同,一个FIN占用一个序号),Server进入CLOSE_WAIT状态。
     (3)第三次挥手:Server发送一个FIN,用来关闭Server到Client的数据传送,Server进入LAST_ACK状态。
      (4)第四次挥手:Client收到FIN后,Client进入TIME_WAIT状态,接着发送一个ACK给Server,确认序号为收到序号+1,Server进入CLOSED状态,完成四次挥手。
      

    为什么建立连接是三次握手,而关闭连接却是四次挥手呢?
      这是因为服务端在LISTEN状态下,收到建立连接请求的SYN报文后,把ACK和SYN放在一个报文里发送给客户端。而关闭连接时,当收到对方的FIN报文时,仅仅表示对方不再发送数据了但是还能接收数据,己方也未必全部数据都发送给对方了,所以己方可以立即close,也可以发送一些数据给对方后,再发送FIN报文给对方来表示同意现在关闭连接,因此,己方ACK和FIN一般都会分开发送。
     
     
  • 相关阅读:
    Java学习资源整理(超级全面)
    Java中的Iterable与Iterator详解
    git使用笔记1:结合Github远程仓库管理项目
    关于LeetCode上链表题目的一些trick
    关于链表中哨兵结点问题的深入剖析
    关于Java中基类构造器的调用问题
    大整数相乘问题总结以及Java实现
    快速排序实现及其pivot的选取
    阿里云服务器部署Java Web项目全过程
    Git 学习总结
  • 原文地址:https://www.cnblogs.com/aliy-pan/p/5604332.html
Copyright © 2011-2022 走看看