OSI&TCP/IP 模型
TCP/IP协议族
TCP/IP
代表传输控制协议/网际协议,指的是一系列协议。
应用层
: TFTP, HTTP, WebSockets, SNMP, FTP, SMTP, DNS, Telnet 等等
传输层
: TCP, UDP
网络层
: IP, ICMP, OSPF, EIGRP, IGMP
数据链路层
: SLIP,CSLIP,PPP,MTU
Scoket(套接字)
Socket
是应用层与TCP/IP协议族通信的中间软件抽象层,它是一组接口。- 在设计模式中,
Socket
其实就是一个门面模式,它把复杂的TCP/IP协议族隐藏在Socket接口后面,对用户来说,一组简单的接口就是全部,让Socket
去组织数据,以符合指定的协议。 TCP/IP
只是一个协议栈,就像操作系统的运行机制一样,要具体实现,并且还要提供对外的操作接口。Socket
是一个抽象层,应用程序可以通过它发送或接收数据,可对其进行像对文件一样的打开、读写和关闭等操作。套接字允许应用程序将I/O插入到网络中,并与网络中的其他应用程序进行通信。网络套接字是IP地址与端口的组合。
SOCK_STREAM(流格式套接字)
面向连接的套接字
SOCK_STREAM 是一种可靠的、双向的通信数据流,数据可以准确无误地到达另一台计算机,如果损坏或丢失,可以重新发送,但效率相对较慢。
- 数据在传输过程中不会消失;
- 数据是按照顺序传输的;
- 数据的发送和接收不是同步的(“不存在数据边界”)。
SOCK_DGRAM(数据报格式套接字)
无连接的套接字
数据报套接字是一种不可靠的、不按顺序传递的、以追求速度为目的的套接字。
计算机只管传输数据,不作数据校验,如果数据在传输中损坏,或者没有到达另一台计算机,是没有办法补救的。也就是说,数据错了就错了,无法重传。因为数据报套接字所做的校验工作少,所以在传输效率方面比流格式套接字要高。
TCP/IP协议
TCP/IP
提供点对点的链接机制,将数据应该如何封装、定址、传输、路由以及在目的地如何接收,都加以标准化。它将软件通信过程抽象化为四个抽象层,采取协议堆栈的方式,分别实现出不同通信协议。协议族下的各种协议,依其功能不同,被分别归属到这四个层次结构之中。
TCP数据报结构
-
序号: Seq(Sequence Number)序号占32位,用来标识从计算机A发送到计算机B的数据包的序号,计算机发送数据时对此进行标记。
-
确认号: Ack(Acknowledge Number)确认号占32位,客户端和服务器端都可以发送,Ack = Seq + 1。
-
标志位: 每个标志位占用1Bit,共有6个,分别为 URG、ACK、PSH、RST、SYN、FIN,具体含义如下:
URG:紧急指针(urgent pointer)有效。
ACK:确认序号有效。
PSH:接收方应该尽快将这个报文交给应用层。
RST:重置连接。
SYN:建立一个新连接。
FIN:断开一个连接。
TCP的三次握手和四次挥手
第一次握手:建立连接。客户端发送连接请求报文段,将SYN位置为1,Seq为x;客户端进入`SYN_SEND`状态,等待服务器的确认;
第二次握手:服务器收到客户端的SYN报文段,需要对这个SYN报文段进行确认,设置ACK为x+1(Seq+1);同时,自己自己还要发送SYN请求信息,将SYN位置为1,Seq为y;服务器端将上述所有信息放到一个报文段(即SYN+ACK报文段)中,一并发送给客户端,此时服务器进入`SYN_RECV`状态;
第三次握手:客户端收到服务器的`SYN+ACK`报文段。然后将ACK设置为y+1,向服务器发送ACK报文段,这个报文段发送完毕以后,客户端和服务器端都进入`ESTABLISHED`状态,完成TCP三次握手。
第一次挥手手:主机1(可以使客户端,也可以是服务器端),设置Seq和Ack,向主机2发送一个FIN报文段;此时,主机1进入FIN_WAIT_1状态;这表示主机1没有数据要发送给主机2了;
第二次分手:主机2收到了主机1发送的FIN报文段,向主机1回一个ACK报文段,Ack为Seq+1;主机1进入FIN_WAIT_2状态;主机2告诉主机1,我“同意”你的关闭请求;
第三次分手:主机2向主机1发送FIN报文段,请求关闭连接,同时主机2进入LAST_ACK状态;
第四次分手:主机1收到主机2发送的FIN报文段,向主机2发送ACK报文段,然后主机1进入TIME_WAIT状态;主机2收到主机1的ACK报文段以后,就关闭连接;此时,主机1等待2MSL后依然没有收到回复,则证明Server端已正常关闭,那好,主机1也可以关闭连接了。
TCP, UDP
TCP
TCP是传输控制协议,提供的是面向连接,可靠的字节流服务,当客户和服务器彼此交换数据前,必须先在双方之间建立一个TCP链接,链接之后才能传输数据,TCP提供超时重发,丢弃重复数据,检验数据,流量控制等功能,保证数据能从一端传到另一端。
UDP
UDP是用户数据报协议,是一个简单的面向数据报的运输层协议,UDP不提供可靠性,它只是把应用程序传给IP层的数据报发出去,但是并不能保证它能到达目的地。由于UDP在传输数据报前不用在客户和服务器之间建立链接,而没有超时重发等机制,故而传输速度非常快。
TCP 和 UDP区别
UDP | TCP | |
---|---|---|
是否连接 | 无连接 | 面向连接 |
是否可靠 | 不可靠传输,不使用流量控制和拥塞控制 | 可靠传输,使用流量控制和拥塞控制 |
连接对象个数 | 支持一对一,一对多,多对一和多对多交互通信 | 只能是一对一通信 |
传输方式 | 面向报文 | 面向字节流 |
首部开销 | 首部开销小,仅8字节 | 首部最小20字节,最大60字节 |
适用场景 | 适用于实时应用(IP电话、视频会议、直播等) | 适用于要求可靠传输的应用,例如文件传输 |
HTTP连接
- HTTP协议即超文本传送协议(Hypertext Transfer Protocol ),是Web联网的基础,也是手机联网常用的协议之一,HTTP协议是建立在TCP协议之上的一种应用。
- HTTP连接最显著的特点是客户端发送的每次请求都需要服务器回送响应,在请求结束后,会主动释放连接。从建立连接到关闭连接的过程称为“一次连接”。
- 在HTTP 1.0中为短连接,客户端的每次请求都要求建立一次单独的连接,在处理完本次请求后,就自动释放连接。
- 在HTTP 1.1中为长连接,则
可以在一次连接中处理多个请求
,并且多个请求可以重叠进行,不需要等待一个请求结束后再发送下一个请求。
- 由于
HTTP在每次请求结束后都会主动释放连接
,因此HTTP连接是一种“短连接”,要保持客户端程序的在线状态,需要不断地向服务器发起连接请求。通常的做法是即时不需要获得任何数据,客户端也保持每隔一段固定的时间向服务器发送一次“保持连接”的请求,服务器在收到该请求后对客户端进行回复,表明知道客户端“在线”。若服务器长时间无法收到客户端的请求,则认为客户端“下线”,若客户端长时间无法收到服务器的回复,则认为网络已经断开。
WebSocket
WebSocket protocol 是HTML5一种新的协议。它实现了浏览器与服务器全双工通信(full-duplex)。一开始的握手需要借助HTTP请求完成。
WebSocket是应用层的协议,但是它是一种双向通信协议,是建立在TCP之上的。
WebSocket与HTTP的关系
相同点
- 都是一样基于TCP的,都是可靠性传输协议。
- 是应用层协议。
不同点
- WebSocket是
双向
通信协议,模拟Socket协议,可以双向发送或接受信息。HTTP是单向
的。 - WebSocket是需要握手进行建立连接的。
联系
WebSocket在建立握手时,数据是通过HTTP传输的。但是建立之后,在真正传输时候是不需要HTTP协议的。