zoukankan      html  css  js  c++  java
  • 三次握手四次分手

    TCP面向连接、可靠;

    当浏览器上层想发http协议的请求头之前,应用层被阻塞,运输层先建立连接(即通过三次握手建立的);

    浏览器 封装完 http协议的请求头的数据包,发不出去,先需要运输层建立连接(三次握手),而运输层还得需要网络层做事,依次向下的每一层都要走完,比如网络层负责这数据包是发给哪个主机;

    ip地址是由两部分组成:网络号,机号;1号网里面有一号机,2号机,3号机......;

    ip地址和子网掩码做二进制的按位与运算的结果是网络号;ip地址除去网络号的剩余部分就是表明了是该网络下的几号机;

    路由表

    主机之间通信,

    把互联网画一张图,存到每台主机里,这是不合理的,解决:每台主机不去规划全链路,下一跳机制,只需一跳即可;每台主机有一个路由表;家里路由器就是家里电脑的下一跳,每个局域网只需要设置一个自己的默认网关,而路由器的下一跳可能是运营商,

    同一个局域网下的主机之间通信是不需要中间网关跳跃的,即不需要下一跳,直接通过交换机发给对方了;

    三次握手(客户端与服务器建立连接时)

    第一次握手:建立连接时,客户端发送syn(同步序列编号,syn=j)数据包到服务器,该数据包是运输层创建的,客户端进入SYN_SENT状态,等待服务器确认;

    第二次握手:

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

    第三次握手:

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

    发送数据,必须另一方发送确认数据。

    三次握手完成之后,连接就有了,cli、server在各自内存当中展开资源,该资源为对方服务,这是三次握手做的事,而不是真正的物理连接。。

    为什么是三次握手,因为cli、server都要确认,从而各自内存展开资源,双方确认,这也是表明了是可靠的;

    socket

    套接字,ip port+ip port,tcp三次握手之后建立起socket,

    netstat:Linux看网络状态的命令,

    netstat -natp,LISTEN 进程监听端口,

    浏览器每个标签页和服务器建立独立的socket连接;

    四次挥手(客户端与服务器关闭连接时)

    四次分手释放端口号,关闭连接,

    (1)客户端进程向服务器发出连接释放报文,并且停止发送数据,释放数据报文首部,FIN=1,其序列号为seq=u(等于前面已经发送到服务器的数据的最后一个字节的序号加1),此时,客户端进入FIN-WAIT-1(终止等待1)状态。 TCP规定,FIN报文段即使不携带数据,也要消耗一个序号。咱俩分手吧。

    (2)服务器收到连接释放报文,向客户端发出确认报文fin+ack(ack=u+1,并且带上自己的序列号seq=v),此时,服务端就进入了CLOSE-WAIT(关闭等待)状态。TCP服务器通知高层的应用进程,客户端向服务器的方向就释放了,这时候处于半关闭状态,即客户端已经没有数据要发送了,但是服务器若发送数据,客户端依然要接受。这个状态还要持续一段时间,也就是整个CLOSE-WAIT状态持续的时间。哼,我听见了。

    (3)客户端收到服务器的确认请求后,此时,客户端就进入FIN-WAIT-2(终止等待2)状态,等待服务器发送连接释放报文(在这之前还需要接受服务器发送的最后的数据);

    服务器将最后的数据发送完毕后,就向客户端发送连接释放报文,FIN=1,ack=u+1,由于在半关闭状态,服务器很可能又发送了一些数据,假定此时的序列号为seq=w,此时,服务器就进入了LAST-ACK(最后确认)状态,等待客户端的确认。好,我们分手。

    (4)客户端收到服务器的连接释放报文后,必须向服务器发出确认,ACK=1,ack=w+1,而自己的序列号是seq=u+1,此时,客户端就进入了TIME-WAIT(时间等待)状态。注意此时TCP连接还没有释放,必须经过2∗∗MSL(最长报文段寿命)的时间后,当客户端撤销相应的TCB后,才进入CLOSED状态。好的好的好的。

    服务器只要收到了客户端发出的确认,立即进入CLOSED状态。同样,撤销TCB后,就结束了这次的TCP连接。可以看到,服务器结束TCP连接的时间要比客户端早一些。

    四次分手总结:客户端发送数据到服务器,告知与之断开连接,服务器向客户端发送确认数据,等待服务器处理已发送到服务器的数据,服务器发送数据到客户端告诉已经处理ok,客户端向服务器发送确认数据,至此ok。四次分手将三次握手建立的资源成功销毁掉。三次握手四次分手必须是双方都同意的,这即是可靠。

  • 相关阅读:
    关于CoreData的使用
    【转】向iOS开发者介绍C++(-)
    Storyboard里面的几种Segue区别及视图的切换:push,modal,popover,replace和custom
    【转】Object-C 多线程中锁的使用-NSLock
    写了半天的返回
    oracle 锁表问题
    LINQ的基本认识
    Oracle客户端配置
    REVERSE
    vchar2和nvchar2
  • 原文地址:https://www.cnblogs.com/yyjh/p/11640037.html
Copyright © 2011-2022 走看看