TCP/IP:
封装:传输层:TCP和UDP---1·TCP是面向连接的协议,而UDP是无连接的协议;
2·TCP协议的传输是可靠的,UDP协议的传输是尽力而为的;
3·TCP协议可实现流控,而UDP不能;
4·TCP协议可以分段,而UDP不行;
5·UDP传输效率快,消耗资源较小;TCP消耗资源大,传输效率慢。
所以,当传输文件为视频,游戏等对速度要求高,但是对可靠性要求较低的即时通讯类时,使用UDP;而传输文件对可靠性要求高,但是对传输效率和资源占用要求较低时,使用TCP;
什么是面向连接:在正式传输数据前,先使用预先的协议,建立点到点的连接;
TCP的连接实际建立了一个双向的会话连接,即通讯双方都可以向对方发送数据。
封装和解封装图解:
TCP和UDP的头部封装:
TCP头部(最短20字节头---1字节=8位):
因为存在选项字段,所以TCP头部长度是可以变化的,被称为可变长头部。
URG:紧急标记位,此位置1时,代表有需要紧急处理的数据,此时紧急指针指向包内数据段的某个字节(数据从第一字节到指针所指字节就是紧急数据,不进入接收缓冲就直接交给上层进程,余下的数据要进入接收缓冲的)
ACK:确认标记位。表示发来的数据已确认接收无误。
在TCP/IP协议中,如果接收方成功的接收到数据,那么会回复一个ACK数据。通常ACK信号有自己固定的格式,长度大小,由接收方回复给发送方。
PSH:数据中某个数据段的该标记位置1 时,该数据段将不在缓存空间中滞留,会优先推给应用程序处理。
RST:若一方发送的数据包中该位置1的话,那么TCP会话将会被强制断开。
SVN:请求标记位,此位置1表明请求建立连接。
FIN:当两端交换带有FIN标志的TCP报文段并且每一端都确认另一端发送的FIN包时,TCP连接将会关闭。FIN位字面上的意思是连接一方再也没有更多新的数据发送。然而,那些重传的数据会被传送,直到接收端确认所有的信息。
校验和:确保数据完整性。
伪头部校验---除了校验TCP头部和数据内容外,还会将网络层头部中的一部分内容一起校验。校验强度较高;
UDP头部(8字节头):
UDP长度:头部长度加数据长度,即数据段长度;
TCP和UDP对比:
1·TCP是面向连接的协议,而UDP是无连接的协议---连接建立:
TCP与UDP的三次握手与四次挥手:
1·三次握手---TCP建立连接的过程:
第一次握手:客户端给服务端发一个 SYN 报文,并指明客户端的初始化序列号 ISN。此时客户端处于 SYN_SEND 状态。
首部的同步位SYN=1,初始序号seq=x,SYN=1的报文段不能携带数据,但要消耗掉一个序号。
第二次握手:服务器收到客户端的 SYN 报文之后,会以自己的 SYN 报文作为应答,并且也是指定了自己的初始化序列号 ISN(s)。同时会把客户端的 ISN + 1 作为ACK 的值,表示自己已经收到了客户端的 SYN,此时服务器处于 SYN_REVD 的状态。
在确认报文段中SYN=1,ACK=1,确认号ack=x+1,初始序号seq=y。
第三次握手:客户端收到 SYN 报文之后,会发送一个 ACK 报文,当然,也是一样把服务器的 ISN + 1 作为 ACK 的值,表示已经收到了服务端的 SYN 报文,此时客户端处于 ESTABLISHED 状态。服务器收到 ACK 报文之后,也处于 ESTABLISHED (已建立)状态,此时,双方已建立起了连接。
确认报文段ACK=1,确认号ack=y+1,序号seq=x+1(初始为seq=x,第二个报文段所以要+1),ACK报文段可以携带数据,不携带数据则不消耗序号。
TCP的四次挥手---TCP会话的断开:
第一次挥手:客户端发送一个 FIN 报文,报文中会指定一个序列号。此时客户端处于 FIN_WAIT1 状态。
即发出连接释放报文段(FIN=1,序号seq=u),并停止再发送数据,主动关闭TCP连接,进入FIN_WAIT1(终止等待1)状态,等待服务端的确认。
第二次挥手:服务端收到 FIN 之后,会发送 ACK 报文,且把客户端的序列号值 +1 作为 ACK 报文的序列号值,表明已经收到客户端的报文了,此时服务端处于 CLOSE_WAIT 状态。
即服务端收到连接释放报文段后即发出确认报文段(ACK=1,确认号ack=u+1,序号seq=v),服务端进入CLOSE_WAIT(关闭等待)状态,此时的TCP处于半关闭状态,客户端到服务端的连接释放。客户端收到服务端的确认后,进入FIN_WAIT2(终止等待2)状态,等待服务端发出的连接释放报文段。
第三次挥手:如果服务端也想断开连接了,和客户端的第一次挥手一样,发给 FIN 报文,且指定一个序列号。此时服务端处于 LAST_ACK 的状态。
即服务端没有要向客户端发出的数据,服务端发出连接释放报文段(FIN=1,ACK=1,序号seq=w,确认号ack=u+1),服务端进入LAST_ACK(最后确认)状态,等待客户端的确认。
第四次挥手:客户端收到 FIN 之后,一样发送一个 ACK 报文作为应答,且把服务端的序列号值 +1 作为自己 ACK 报文的序列号值,此时客户端处于 TIME_WAIT 状态。需要过一阵子以确保服务端收到自己的 ACK 报文之后才会进入 CLOSED 状态,服务端收到 ACK 报文之后,就处于关闭连接了,处于 CLOSED 状态。
即客户端收到服务端的连接释放报文段后,对此发出确认报文段(ACK=1,seq=u+1,ack=w+1),客户端进入TIME_WAIT(时间等待)状态。此时TCP未释放掉,需要经过时间等待计时器设置的时间2MSL后,客户端才进入CLOSED状态。
为什么建立连接是三次而断开连接是四次?
挥手时,由于数据传输量可能不同,所以在ACK置1时由于数据可能还未发完,所以FIN不能同ACK一起发送,所以需要经历四次挥手;而握手时跟数据传输无关,所以ACK可以与SVN一同发送,只需经历三次握手即可。
2·TCP协议的传输是可靠的,UDP协议的传输是尽力而为的:
TCP的可靠性保证----确认,重传,排序,流控
流控---需要依靠窗口大小---流控是在通信过程中,为了防止数据丢失而采取的一种平衡发送和接收的机制
滑动窗口---传送数据过程中,一方发送数据包并给定一个窗口值,若另一方有能力处理,则回以相同的窗口值;该方会逐渐增加数据包直至到达另一方的处理上限,另一方回以处理上限窗口值,溢出未处理的数据包将在下一轮重新发出。(另一方回的数据包中,ACK=1,acknumber=窗口值+1)
3·TCP协议可实现流控,而UDP不能(解释如上)
4·TCP协议可以分段,而UDP不行---TCP有序号,所以可以实现拆分;
5·UDP传输效率快,消耗资源较小;TCP消耗资源大,传输效率慢
(网络层)IP协议—
IP头部图解:
协议号---上层所使用的协议类型—TCP(6),UDP(17)---传输时会用数字代表协议类型,每种协议有一个对应的数字;
IP的分片和TCP的分段(最根本是因为MTU的限制)
MTU----最大传输长度---默认1500字节:最大传输单元MTU(Maximum Transmission Unit,MTU),是指网络能够传输的最大数据包大小,以字节为单位。MTU的大小决定了发送端一次能够发送报文的最大字节数。
MSS---最大段长度----理论值(1460字节,此值需要协商,此参数在TCP的SYN包携带,若双方不一致,则将按照小的执行。)---最大报文段长度(MSS)是TCP协议的一个选项,用于在TCP连接建立时,收发双方协商通信时每一个报文段所能承载的最大数据长度(不包括文段头)