输入网址背后发生的那些事:
1.DNS域名解析 : 查找域名对应的IP地址
2.建立socket连接【TCP3次握手】
3. 发起请求 : 向IP对应的服务器发送http请求
4.响应请求并传输数据 : 服务器响应http请求,发回网页内容
5.浏览器解析网页内容 : 浏览器解析并渲染呈现给用户
6.连接结束【TCP4次挥手】
什么是Socket
什么是TCP/IP协议
建立socket连接,为什么要TCP三次握手
什么是Socket
Socket是对TCP(Transmission Control Protocol )/IP(Internet Protocol)协议的封装,Socket本身并不是协议,而是一个调用接口(API),通过Socket,我们才能使用TCP/IP协议。
什么是TCP/IP协议
TCP/IP协议是一系列构成互联网基础的网络协议,是Internet的核心协议。
基于TCP/IP的参考模型将协议大体分成四个层次,它们分别是链路层、网络层、传输层和应用层。不同的"层面"中,需要使用不同的协议。
TCP/IP协议族按照层次由上到下,层层包装。最上面的是应用层,这里面有http(http是HyperText Transfer Protocol的缩写,HyperText Transfer Protocol译为"超文本传输协议"。),ftp,等等我们熟悉的协议。而第二层则是传输层,著名的TCP和UDP协议就在这个层次。第三层是网络层,IP协议就在这里,它负责对数据加上IP地址和其他的数据以确定传输的目标。第四层是数据链路层,这个层次为待传送的数据加入一个以太网协议头,并进行CRC编码,为最后的数据传输做准备。
上图清楚地表示了TCP/IP协议中每个层的作用,而TCP/IP协议通信的过程其实就对应着数据入栈与出栈的过程。入栈的过程,数据发送方每层不断地封装首部与尾部,添加一些传输的信息,确保能传输到目的地。出栈的过程,数据接收方每层不断地拆除首部与尾部,得到最终传输的数据。
简化结构图
建立socket连接,为什么要TCP三次握手
TCP是面向连接的,无论哪一方向另一方发送数据之前,都必须先在双方之间建立一条连接。在TCP/IP协议中,TCP协议提供可靠的连接服务,连接是通过三次握手进行初始化的。三次握手的目的是同步连接双方的序列号和确认号并交换 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并没有要求建立连接。”