• HTTP学习---TCP三次握手和四次挥手


    IP协议

      首先我们看 IP(Internet Protocol)协议。IP 协议提供了主机和主机间的通信。

      为了完成不同主机的通信,我们需要某种方式来唯一标识一台主机,这个标识,就是著名的IP地址。通过IP地址,IP 协议就能够帮我们把一个数据包发送给对方。

    TCP协议

      前面我们说过,IP 协议提供了主机和主机间的通信。TCP 协议在 IP 协议提供的主机间通信功能的基础上,完成这两个主机上进程对进程的通信。

    有了 IP,不同主机就能够交换数据。但是,计算机收到数据后,并不知道这个数据属于哪个进程(简单讲,进程就是一个正在运行的应用程序)。TCP 的作用就在于,让我们能够知道这个数据属于哪个进程,从而完成进程间的通信。

      为了标识数据属于哪个进程,我们给需要进行 TCP 通信的进程分配一个唯一的数字来标识它。这个数字,就是我们常说的端口号。

      TCP 的全称是 Transmission Control Protocol,大家对它说得最多的,大概就是面向连接的特性了。之所以说它是有连接的,是说在进行通信前,通信双方需要先经过一个三次握手的过程。三次握手完成后,连接便建立了。这时候我们才可以开始发送/接收数据。(与之相对的是 UDP,不需要经过握手,就可以直接发送数据)。

    TCP与UDP的区别

    UDP:

    ①面向无连接,不需要建立连接,不可靠协议

    ②将数据及源和目的分装在数据包中,每个数据包的大小限制在64K内

    ③不需要简历连接,速度快

    TCP:

    ①建立连接,形成传输数据的通道

    ②在连接中进行大量数据传输

    ③通过三次握手完成连接,是可靠协议

    ④必须建立连接,效率会稍低

    2,TCP的三次握手是怎样的?为什么是三次而不是两次

    1).三次握手协议:

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

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

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

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

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

    3.SYN

    SYN(synchronous)是TCP/IP建立连接时使用的握手信号。在客户机和服务器之间建立正常的TCP网络连接时,客户机首先发出一个SYN消息,服务器使用SYN+ACK应答表示接收到了这个消息,最后客户机再以ACK消息响应。这样在客户机和服务器之间才能建立起可靠的TCP连接,数据才可以在客户机和服务器之间传递。

    TCP连接的第一个包,非常小的一种数据包。SYN 攻击包括大量此类的包,由于这些包看上去来自实际不存在的站点,因此无法有效进行处理。每个机器的欺骗包都要花几秒钟进行尝试方可放弃提供正常响应。

    4.ACK

    ACK (Acknowledgement),即确认字符,在数据通信中,接收站发给发送站的一种传输类控制字符。表示发来的数据已确认接收无误。

    解 释: 在数据通信传输中,接收站发给发送站的一种传输控制字符。它表示确认发来的数据已经接收无误。

    在TCP/IP协议中,如果接收方成功的接收到数据,那么会回复一个ACK数据。通常ACK信号有自己固定的格式,长度大小,由接收方回复给发送方。其格式取决于采取的网络协议。当发送方接收到ACK信号时,就可以发送下一个数据。如果发送方没有收到信号,那么发送方可能会重发当前的数据包,也可能停止传送数据。具体情况取决于所采用的网络协议。

    1、TCP报文格式中的控制位由6个标志比特构成,其中一个就是ACK,ACK为1表示确认号有效,为0表示报文中不包含确认信息,忽略确认号字段。

    2、ACK也可用于AT24cxx这一系列的EEPROM中。

    3、在USB传输中,ACK事务包用来向主机/设备报告包正确的传输。

    TCP三次握手的Socket过程:

    TCP三次握手的Socket

    小白程序员|Socket通信原理详解

    • 服务器调用socket()、bind()、listen()完成初始化后,调用accept()阻塞等待;
    • 客户端Socket对象调用connect()向服务器发送了一个SYN并阻塞;
    • 服务器完成了第一次握手,即发送SYN和ACK应答;
    • 客户端收到服务端发送的应答之后,从connect()返回,再发送一个ACK给服务器;
    • 服务器Socket对象接收客户端第三次握手ACK确认,此时服务端从accept()返回,建立连接。

    接下来就是两个端的连接对象互相收发数据。

    TCP四次挥手的Socket过程:

    TCP四次挥手的Socket

    小白程序员|Socket通信原理详解

    • 某个应用进程调用close()主动关闭,发送一个FIN;
    • 另一端接收到FIN后被动执行关闭,并发送ACK确认;
    • 之后被动执行关闭的应用进程调用close()关闭Socket,并也发送一个FIN;
    • 接收到这个FIN的一端向另一端ACK确认。

    上面的代码是简单的演示Socket的基本函数使用,其实不管有多复杂的网络程序,这些基本函数都会用到。上面的服务端代码只有处理完一个客户端请求才会去处理下一个客户端的请求,这样的服务器处理能力很弱,而实际中服务器都需要有并发处理能力,为了达到并发处理,服务器就需要fork一个新的进程或者线程去处理请求。

    【学习参考】

    https://www.toutiao.com/i6593997345594016263/

  • 相关阅读:
    删除datatable的重复行
    导出大Excel
    winform调用plugin
    System.AppDomain.CurrentDomain.BaseDirectory总是取得根目录
    能不能多想一点呢?
    执行语句使用exec (sql)
    open the folder
    取得一个表的所有字段
    快讯:麦考林第四季度净利110万美元同比减62%
    麦考林第四季度净利110万美元同比减62%(图解)
  • 原文地址:https://www.cnblogs.com/ftl1012/p/9563027.html
Copyright © 2020-2023  润新知