TCP/IP、HTTP、socket

来源:互联网 发布:战略管理 知乎 编辑:程序博客网 时间:2024/05/19 00:41

网络由下至上:物理层、数据链路层、网络层、传输层、应用层
IP协议对应网络层
TCP协议对应传输层
HTTP协议对应应用层
socket是对TCP/IP协议的封装和应用
TCP/IP协议可以说是传输层协议,主要解决数据如何在网络中传输
HTTP是应用层协议,主要解决如何包装数据
传输数据时,只使用TCP/IP协议,没有应用层的参与无法识别数据内容,必须使用到应用层协议(如:HTTP、FTP、Telnet等),也可以自己定义
web使用HTTP协议作为应用层协议,封装HTTP文本信息,然后使用TCP/IP作为传输层协议,将数据发到网上
socket是对TCP/IP协议的封装,本身并不是协议,而是一个调用接口(API)通过socket才能使用TCP/IP协议
传输层的TCP协议是基于网络层IP协议的,应用层的HTTP协议是基于传输层TCP协议的,socket本身不是协议,他提供给我们一个针对于TCP编程的接口

一、TCP三次握手
第一次握手:客户端发送SYN包到服务器,并进入SYN_SEND状态,等待服务器确认

第二次握手:服务端收到SYN包,必须确认客户的SYN,同时自己也发送一个SYN包,即SYN+ACK包,此时服务器进入SYN_RECV状态

第三次握手:客户端收到服务端SYN_ACK包,像服务器发送确认包ACK,此包发送完毕,客户端和服务端进入ESTABLISHED状态,完成三次握手

TCP三次握手

  • 握手过程中传送的包里不包含数据,三次握手后,客户端与服务器才正式开始传送数据
  • 理想状态下,TCP连接一旦建立,在通信双方中任何一方主动关闭连接前,TCP连接都将被一直保持下去
  • 断开连接时,客户端和服务端均可以主动发起断开TCP连接的请求,断开过程需要经过“四次握手”

二、四次握手
(1)客户端A发送一个FIN,用来关闭客户A到服务器B的数据传送
(2)服务器B收到FIN,发回一个ACK,确认序号为收到的序号加1。和SYN一样,一个FIN占用一个序号
(3)服务器B关闭与客户A的连接,发送一个FIN给客户端A
(4)客户端A发回ACK报文确认,并将确认序号设置为收到序号加1

四次握手

  • 服务端的LISTEN状态下的socket当收到SYN报文的建立请求后,可以把ACK和SYN放在一个报文里来发送。但关闭连接时,当收到FIN报文通知时,仅仅表示对方没有数据发送给你了,但你未必把所有的数据全都发送给了对方,所以你未必会马上关闭socket,即你还需要发送一些数据给对方后,再发送FIN报文给对方表示你现在同意关闭连接了,这里ACK和FIN报文多数情况下分开来发送

三、利用socket建立网络连接的步骤
建立socket连接至少需要一对套接字,其中一个运行于客户端,称为ClientSocket,另一个运行于服务端,称为ServerSocket
套接字连接过程分为:服务器监听、客户端请求、连接确认

  1. 服务器监听:服务器端套接字并不定位具体的客户端套接字,而是处于等待连接状态,实时监控网络状态,等待客户端的连接请求
  2. 客户端请求:指客户端的套接字提出连接请求,连接目标是服务器端套接字,为此,客户端的套接字必须首先描述他要连接的服务器的套接字,指出服务器端套接字的地址和端口号,然后就向服务器端套接字提出连接请求
  3. 连接确认:当服务器端套接字监听到或者是接收到客户端套接字的连接请求时,就响应客户端套接字的请求,建立一个新的线程,把服务端套接字的描述发给客户端,一旦客户端确认了此描述,双方正式建立连接。服务器端套接字继续处于监听状态,继续接受其他客户端套接字的连接请求

四、TCP和UDP区别

  1. TCP面向连接的,三次握手在最低限度上保证了连接的可靠性
  2. UDP不是面向连接的,UDP传送数据前并不与对方建立连接,对接收到的数据也不发送确认信号,发送端不知道数据是否会正确接收,当然也不用重发,所以说UDP是无连接的、不可靠的一种数据传输协议。