TCP/IP是个什么东西
简单来说TCP/IP就是一种网络协议,是计算机诸多网络协议中常用且具有代表性的协议,计算机互联网络协议结构体系中,对这些网络协议进行了归纳,TCP/ IP就是诸多协议的集合统称
TCP/IP协议4层模型
- 协议简单来说就是在实现网络通信之前事先约定的策略,也可以理解为行为规范就叫协议
- 互联是由一整套的协议组成,TCP/IP只是互联网4层的其中的两层,有自己的分工
- Application (应用层)
- 这里面有http,ftp,等等我们熟悉的协议
- TCP协议(传输层)
- TCP是IP协议的上层协议,Application层的下层协议
- 简单来说,TCP是面向连接的,作用和优点就是保证 数据的完整性和可靠性,防止丢包。
- IP协议(网络层)
- IP协议定义了一套地址规则,实现了路由功能,允许局域网之间通信。路由器的产生就是基于IP地址,局域网之间通信要靠路由器连接。
- 那IP协议只是一个地址协议,不能保证数据包的传输完整,如果路由器丢包了怎么办,肯定是需要发现丢的是哪一个包,如何重新发送这个包,以保证数据完整性,这就需要依赖上层协议TCP了。
- Ethernet以太网(链路层)
- 链路层主要实现了局域网内部点对点通信,但也只限于内部,不能做到局域网之间通信,那怎么办,这由IP协议实现
链路层就好像小时候没有装锅盖的电视机只能收到固定的几个中央台
IP协议就好像装了锅盖和机顶盒,可以搜到全国的卫视频道
TCP才是最后能让用户看到电视的重要传输协议,甚至能做到让电视机拥有视频通话功能 - Application (应用层)
TCP 数据包的大小
以太网数据包(packet)大小是固定的1522字节
- 其中负载(playload)1500字节,头信息22字节(head)
- 那IP协议数据是放置在以太网负载数据里面的,IP协议也有他的头信息(最少20字节),以太网的1500字节负载是需要减掉20的IP头文件,所以IP协议最高负载时1480字节
- 接着IP上层协议TCP协议数据包是放置在IP负载数据包里面,同样TCP协议也有他的头文件(最少20个字节),所以TCP的最大负载1480 - 20 = 1460 字节,
- 由于TCP/IP往往有额外的头信息,所以TCP实际负载在1400字节左右。
这就好像一个人他最多只能背着150.0斤大米的从a点到b点,实际情况他的袋子本身就占了5斤,中间坐公交车又转车花了5斤大米支付路费,最终只能送到140斤。
TCP 数据包的编号
一个TCP最大负载1400字节,如果碰到一次性发送大量数据,那就需要分成多个包,比如一个10M的包,1024b102410/1400=7489,要分7489个包发送。
- 那分这么多包,怎么保证数据的完整性和可靠性
- 发送的时候TCP为每个数据包编号(sequence number,简称 SEQ),接收方按编号还原,就算丢包了也能知道丢的哪个包
- TCP的编号规则,第一个包的编号为随机数x,假定这里负载长度数为100,那么可以推算出来下一个包的编号为x+100+1,也就是说一个发送的数据包有两个编号;一个当前自身编号和下一个数据包的编号
TCP数据包的组装
应用层收到的TCP数据包是完整的,组装还原数据包由操作系统完成,还原后直接交给应用层,应用层不参与操作数据包
TCP慢启动和握手ACK
数据包的发送当然越快越好,但现实的情况数据包的速率会受很多因素影响,比如带宽小,比如路由器过热,缓存溢出等等因素都会造成丢包
- TCP为了能在线路条件允许的情况下,同时保证数据的效率和可靠性统一,设计了一个慢启动机制:一开始发送的慢点,然后根据丢包情况调整速率
三次握手
- 那在发送过程中,假如一次性发送10个数据包,这时候需要等待接收方确认后才继续发送,这个过程叫第一次握手SYN(分割发送同步)
- 一般接受方在每收到两个数据包后,就要发送一个确认消息,这个过程叫第二握手,英文简称ACK(承认),
- ACK 携带两个信息。
- 下一个数据包的编号,表示期待收到下一个数据包
- 接收方的接收窗口的剩余容量
- ACK 携带两个信息。
- 按道理两次握手就已经达成确认,为什么要三次
- TCP协议是双向协议,所以双方都需要发送ACK确认,这就有了第三次握手确认,告知接收方;
- 打个比方,就好像你微信问我借钱,我回答说可以,然后我发个视频过去确认是否本人,你不接那我这钱就不借给你。
- 三次握手以发送方ack结束后,才开始传输数据 write,read
四次挥手
- 那在数据传输完成后,为了保证数据的可靠性,避免因单方面退出造成数据离线,客户端第一次挥手,表示我想退出了flin,
- 服务器收到消息告知,我收到你的想法
- 如果此时服务器没有要发送的数据了,再次告知客户端,那咱就结束这次通信吧
- 客户端收到服务器的两次消息后,当下也没有要发送的数据了,告知服务器,OK,4次挥手后这才算断开通信
TCP数据遗失处理
- 每个数据包都带有下个数据包的编号SQN,如果接收方没有收到该编号的数据包,那么ACK的编号不会发生变化,直到收到该编号的包
- 如果发送方收到三个连续重复的ACK,或者超时没有收到任何ACK,就确认丢包,再次发送该编码包
警言
- 天下事以难而废者十之一,以惰而废者十之九 (勇敢)
- 多门之室生风,多言之人生祸 (稳重)
- 慎独且意坚 ,不坠青云志 (独处)
- 但行好事 ,莫问前程 (善良)
总结
如果文章对你有帮助,希望能得到您的点赞鼓励,谢您呢!