IOS七层模型:
应用层、表示层、会话层、传输层、网络层、数据链路层、物理层。
tcp/ip协议五层模型:
应用层 传输层 网络层 数据链路层 物理层。
TCP是一种面向连接的、可靠的、基于字节流的传输层(Transport layer)通信协议。是专门为了在不可靠的互联网络上提供一个可靠的端到端字节流而设计的。每一次TCP连接都需要三个阶段:连接建立、数据传送和连接释放。“三次握手”就发生在连接建立阶段。
TCP的过程:
TCP连接在发送后将仍然保持打开状态,于是,浏览器可以继续通过相同的连接发送请求。保持连接节省了为每个请求建立新连接所需的时间,还节约了网络带宽。
建立TCP连接->发送请求行->发送请求头->(到达服务器)发送状态行->发送响应头->发送响应数据->断TCP连接
TCP和UDP的区别:
TCP
(传输控制协议)是基于连接的协议,也就是说,在正式收发数据前,必须和对方建立可靠的连接。一个TCP
连接必须要经过三次“对话”才能建立起来
UDP
(用户数据报协议)是与TCP相对应的协议。它是面向非连接的协议,它不与对方建立连接,而是直接就把数据包发送过去! UDP适用于海量数据、对可靠性要求不高的应用环境
TCP: UDP:
面向字节 建立连接; 不建立连接;
安全可靠; 不安全不可靠;
传输类型是字节; 传输类型是报文;
传输速度慢; 传输速度快;
全双工通信; 传输大量数据允许数据丢失;
会尽力传输;
SYN=1:
请求建立连接;答应请求链接。
ACK=1:
确认接收字段号。
三次握手:
我的话语来描述:假如是两次握手,客户端给服务器发送一个请求,服务器接收请求建立连接完成,可是因为阻塞所以客户端第一次消息没有发完,当第二个消息发送过去的时候,服务器会等待客户端发送建立连接的请求,可是客户端会认为这是第一个的消息,所以不会在建立连接,那么客户端就会一直一直等下去。造成服务器的等待和资源的浪费。
三次握手主要是为了防止已失效的连接请求报文突然到达服务器,造成服务器的等待和资源的浪费。
1) Client首先发送一个连接试探,ACK=0 表示确认号无效,SYN = 1 表示这是一个连接请求或连接接受报文,同时表示这个数据报不能携带数据,seq = x 表示Client自己的初始序号(seq = 0 就代表这是第0号包),这时候Client进入syn_sent状态,表示客户端等待服务器的回复
2) Server监听到连接请求报文后,如同意建立连接,则向Client发送确认。TCP报文首部中的SYN 和 ACK都置1 ,ack = x + 1表示期望收到对方下一个报文段的第一个数据字节序号是x+1,同时表明x为止的所有数据都已正确收到(ack=1其实是ack=0+1,也就是期望客户端的第1个包),seq = y 表示Server 自己的初始序号(seq=0就代表这是服务器这边发出的第0号包)。这时服务器进入syn_rcvd,表示服务器已经收到Client的连接请求,等待client的确认。
3) Client收到确认后还需再次发送确认,同时携带要发送给Server的数据。ACK 置1 表示确认号ack= y + 1 有效(代表期望收到服务器的第1个包),Client自己的序号seq= x + 1(表示这就是我的第1个包,相对于第0个包来说的),一旦收到Client的确认之后,这个TCP连接就进入Established状态,就可以发起http请求了。
请求形式:请求行 请求头 请求体
二、四次挥手
自己理解:客户端给服务器发送FIN=1请求断开,服务器给客户端返回ACK=1同意断开;服务器给客户端在发送一个FIN请求断开,客户端给服务器返回一个ACK完成四次挥手。
1.原理:
由于TCP连接时全双工的,因此,每个方向都必须要单独进行关闭,这一原则是当一方完成数据发送任务后,发送一个FIN来终止这一方向的连接,收到一个FIN只是意味着这一方向上没有数据流动了,即不会再收到数据了,但是在这个TCP连接上仍然能够发送数据,直到这一方向也发送了FIN。首先进行关闭的一方将执行主动关闭,而另一方则执行被动关闭。