建立socket连接【TCP三次握手】---输入网址背后发生的那些事

什么是Socket
什么是TCP/IP协议
建立socket连接,为什么要TCP三次握手

什么是Socket

  Socket是对TCP(Transmission Control Protocol )/IP(Internet Protocol)协议的封装,Socket本身并不是协议,而是一个调用接口(API),通过Socket,我们才能使用TCP/IP协议。

什么是TCP/IP协议

  TCP/IP协议是一系列构成互联网基础的网络协议,是Internet的核心协议。
建立socket连接【TCP三次握手】---输入网址背后发生的那些事
  基于TCP/IP的参考模型将协议大体分成四个层次,它们分别是链路层、网络层、传输层和应用层。不同的"层面"中,需要使用不同的协议。
建立socket连接【TCP三次握手】---输入网址背后发生的那些事
  TCP/IP协议族按照层次由上到下,层层包装。最上面的是应用层,这里面有http(http是HyperText Transfer Protocol的缩写,HyperText Transfer Protocol译为"超文本传输协议"。),ftp,等等我们熟悉的协议。而第二层则是传输层,著名的TCP和UDP协议就在这个层次。第三层是网络层,IP协议就在这里,它负责对数据加上IP地址和其他的数据以确定传输的目标。第四层是数据链路层,这个层次为待传送的数据加入一个以太网协议头,并进行CRC编码,为最后的数据传输做准备。
建立socket连接【TCP三次握手】---输入网址背后发生的那些事
  上图清楚地表示了TCP/IP协议中每个层的作用,而TCP/IP协议通信的过程其实就对应着数据入栈与出栈的过程。入栈的过程,数据发送方每层不断地封装首部与尾部,添加一些传输的信息,确保能传输到目的地。出栈的过程,数据接收方每层不断地拆除首部与尾部,得到最终传输的数据。

简化结构图

建立socket连接【TCP三次握手】---输入网址背后发生的那些事

建立socket连接,为什么要TCP三次握手

  TCP是面向连接的,无论哪一方向另一方发送数据之前,都必须先在双方之间建立一条连接。在TCP/IP协议中,TCP协议提供可靠的连接服务,连接是通过三次握手进行初始化的。三次握手的目的是同步连接双方的***和确认号并交换 TCP窗口大小信息
建立socket连接【TCP三次握手】---输入网址背后发生的那些事

备注:

  • SYN(synchronous建立联机)
  • ACK(acknowledgement 确认)
  • PSH(push传送)
  • FIN(finish结束)
  • RST(reset重置)
  • URG(urgent紧急)
  • Sequence number(顺序号码)
  • Acknowledge number(确认号码)

过程

  第一次握手: 建立连接。客户端发送连接请求报文段,将SYN位置为1,Sequence Number为x;然后,客户端进入SYN_SEND状态,等待服务器的确认;
  第二次握手: 服务器收到SYN报文段。服务器收到客户端的SYN报文段,需要对这个SYN报文段进行确认,设置Acknowledgment Number为x+1(Sequence Number+1);同时,自己自己还要发送SYN请求信息,将SYN位置为1,Sequence Number为y;服务器端将上述所有信息放到一个报文段(即SYN+ACK报文段)中,一并发送给客户端,此时服务器进入SYN_RECV状态;
  第三次握手: 客户端收到服务器的SYN+ACK报文段。然后将Acknowledgment Number设置为y+1,向服务器发送ACK报文段,这个报文段发送完毕以后,客户端和服务器端都进入ESTABLISHED状态,完成TCP三次握手。

  三次握手成功后,开始传输数据。
  一个完整的三次握手也就是 请求—应答—再次确认。
  链接建立成功后,就要开始下一步,传输数据。

举例

  A : 你好我是A,你能听得到我说话吗? A->SYN_SEND
  B : 听到了,我是B,你能听到我说话吗? B->SYN_RCVD | A->ESTABLISHED
  A : 可以,听到了,今天balabala B->ESTABLISHED
好建立连接,开始聊天!

为什么要三次握手?

  为了防止已失效的连接请求报文段突然又传送到了服务端,因而产生错误。
  具体例子:“已失效的连接请求报文段”的产生在这样一种情况下:client发出的第一个连接请求报文段并没有丢失,而是在某个网络结点长时间的滞留了,以致延误到连接释放以后的某个时间才到达server。本来这是一个早已失效的报文段。但server收到此失效的连接请求报文段后,就误认为是client再次发出的一个新的连接请求。于是就向client发出确认报文段,同意建立连接。假设不采用“三次握手”,那么只要server发出确认,新的连接就建立了。由于现在client并没有发出建立连接的请求,因此不会理睬server的确认,也不会向server发送数据。但server却以为新的运输连接已经建立,并一直等待client发来数据。这样,server的很多资源就白白浪费掉了。采用“三次握手”的办法可以防止上述现象发生。例如刚才那种情况,client不会向server的确认发出确认。server由于收不到确认,就知道client并没有要求建立连接。”