zoukankan      html  css  js  c++  java
  • 【HTTP协议】---TCP三次握手和四次挥手

    转载于 https://www.cnblogs.com/qdhxhz/p/8470997.html

    TCP三次握手和四次挥手

          首先我们知道HTTP协议通常承载于TCP协议之上,HTTPS承载于TLS或SSL协议层之上

          

    通过上面这张图我们能够知道。
         在Http工作之前,Web浏览器通过网络和Web服务器建立链连接,该连接是通过Tcp来完成的,该协议和Ip共同组成了Internet,即著名的Tcp/Ip协议族,Http是比Tcp更高的应用层协议,一般Tcp接口的端口好是80
         TCP 被称为“面向连接”的传输层协议。关于它的具体细节,就不展开了。你只需知道:传输层主要有两个协议,分别是 TCP 和 UDP。TCP 比 UDP 更可靠。你可以把 TCP 协议想象成某个水管,发送端这头进水,接收端那头就出水。并且 TCP 协议能够确保,先发送的数据先到达(与之相反,UDP 不保证这点)

    一、TCP简介                                

       TCP(Transmission Control Protocol) 传输控制协议
       TCP是主机对主机层的传输控制协议,提供可靠的连接服务,采用三次握手确认建立一个连接:
       位码即tcp标志位,有6种标示:SYN(建立联机)  ACK(确认)   PSH(传送)   FIN(结束)   RST(重置)    URG(紧急)
        Sequence number(顺序号码)     Acknowledge number(确认号码)

    二、TCP三次握手                         

      第一次握手:客户端发送了一个带有SYN(建立连接)Tcp报文到服务器,这个三次握手中的开始。表示客户端想要和服务端建立连接。  

      第二次握手:服务端接收到客户端的请求,返回客户端报文,这个报文带有SYN(建立连接)ACK(确认)标志,询问客户端是否准备好。 

      第三次握手:.客户端再次响应服务端一个ACK(确认),表示我已经准备好。

    思考:为什么要三次握手呢,有人说两次握手就好了
    举一个例子:已失效的连接请求报文段, 
    client发送了第一个连接的请求报文,但是由于网络不好,这个请求没有立即到达服务端,而是在某个网络节点中滞留了,直到某个时间才到达server,本来这已经是一个失效的报文,但是server端接收到这个请求报文后,还是会想client发出确认的报文,表示同意连接。假如不采用三次握手,那么只要server发出确认,新的建立就连接了,但其实这个请求是失效的请求,client是不会理睬server的确认信息,也不会向服务端发送确认的请求,但是server认为新的连接已经建立起来了,并一直等待client发来数据,这样,server的很多资源就没白白浪费掉了,采用三次握手就是为了防止这种情况的发生,server会因为收不到确认的报文,就知道client并没有建立连接。这就是三次握手的作用。

     三、TCP的四次挥手                   

    第一次握手:TCP发送一个FIN(结束),用来关闭客户到服务端的连接。

    第二次握手:服务端收到这个FIN,他发回一个ACK(确认),确认收到序号为收到序号+1,和SYN一样,一个FIN将占用一个序号。

    第三次握手:服务端发送一个FIN(结束)到客户端,服务端关闭客户端的连接。

    第四次握手:客户端发送ACK(确认)报文确认,并将确认的序号+1,这样关闭完成。

    思考:那么为什么是4次挥手呢? 
        可能有人会有疑问,tcp我握手的时候为何ACK(确认)和SYN(建立连接)是一起发送。挥手的时候为什么是分开的时候发送呢.
        因为当Server端收到Client端的SYN连接请求报文后,可以直接发送SYN+ACK报文。其中ACK报文是用来应答的,SYN报文是用来同步的。但是关闭连接时,当Server端收到FIN报文时,很可能并不会立即关闭             SOCKET,所以只能先回复一个ACK报文,告诉Client端,"你发的FIN报文我收到了"。只有等到我Server端所有的报文都发送完了,我才能发送FIN报文,因此不能一起发送。故需要四步握手。

     四、TCP和UDP的区别      

      我这里简单列举几个,因为我还没有研究UDP这个协议。

      1.基于连接与无连接;(UDP是非连接)

      2.对系统资源的要求(TCP较多,UDP少); 

      3.UDP程序结构较简单

      4.流模式与数据报模式 ;(TCP是流模式)

      5.TCP保证数据正确性,UDP可能丢包,TCP保证数据顺序,UDP不保证。

  • 相关阅读:
    PHP笔记2__变量/字符串/类型转换/常量/,,
    hdu 5108 Alexandra and Prime Numbers(水题 / 数论)
    C#课程设计----------C#学生成绩管理系统
    Java各种学习资源(视频+文档)
    基于慕课网-----Java验证码的实现
    数组prototype添加函数呢,采用回调判定函数内容
    js正则表达式
    jsunit测试
    bind,call,apply区别
    JS技巧
  • 原文地址:https://www.cnblogs.com/magepi/p/10239524.html
Copyright © 2011-2022 走看看