TCP/IP协议相关

0、TCP/IP四层协议

应用层,网络层,传输层,数据链路层
TCP/IP协议相关

1、数据链路层:

数据链路层常用的两个协议是ARP协议和RARP协议,实现IP地址和MAC地址的相互转化

2、网络层

网络层实现数据包的转发和选路,重要的协议是IP协议和ICMP协议

IP协议根据数据包的目的IP地址来决定如何投递它。如果数据包不能直接发送给目标主机,那么IP协议就为它寻找一个合适的下一跳(next hop)路由器,并将数据包交付给该路由器来转发

ICMP协议主要用于检测网络连接,分为两大类差错报文和查询报文,差错报文用来回应网络错误,比如不可到达等,查询报文报文用来查询网络信息,比如ping命令等

3、传输层

传输层为两台电主机上的应用程序提供端到端的通信,重要的协议有TCP,UDP协议

TCP为应用层提供可靠的,面向连接的,基于流的服务;TCP协议使用超时重传、数据确认等方式来确保数据包被正确地发送至目的端;TCP服务是基于流的。基于流的数据没有边界(长度)限制,它源源不断地从通信的一端流入另一端。发送端可以逐个字节地向数据流中写入数据,接收端也可以逐个字节地将它们读出。

UDP为应用层提供不可靠的,面向无连接的,基于数据报的服务;不可靠”意味着UDP协议无法保证数据从发送端正确地传送到目的端。UDP协议是无连接的,即通信双方不保持一个长久的联系,因此应用程序每次发送数据都要明确指定接收端的地址(IP地址等信息);基于数据报的服务,是相对基于流的服务而言的。每个UDP数据报都有一个长度,接收端必须以该长度为最小单位将其所有内容一次性读出,否则数据将被截断。

4、粘包与分包问题

只有TCP才会发生粘包分包问题,UDP有消息保护边界,不会出现这种问题

消息保护边界:流传输把数据当作一串数据流,他不认为数据是一个一个的消息,而UDP协议的保护消息边界使得每一个消息都是独立的.因此不会发生粘包分包问题

假设客户端向服务端连续发送了两个数据包packet1和packet2,服务端收到的数据可以分为以下三种:
第一种:正常接收
TCP/IP协议相关
第二种:一个数据包中包含了发送端发送的两个数据包,但是接收端不知道两个数据包的边界,难以处理,这种情况称为粘包
TCP/IP协议相关
第三种:收到了两个数据包,要么是不完整的,要么是多出了一块,发生了粘包和拆包
TCP/IP协议相关

产生的原因:
发送数据的时候应用层将数据写入到缓冲区中,TCP将缓冲区中的数据发送出去;接收的时候数据放在缓冲区中,应用层从缓冲区中读取数据

1.要发送的数据大于TCP发送缓冲区的剩余大小,发生拆包
2.要发送的数据大于最大的报文长度,TCP在发送前进行拆包
3.TCP将多次写入缓冲区的数据一起发送出去,出现粘包
4.接收端的应用层没有及时读取缓冲区的内容,发生粘包

解决办法:
1.发送端给每个数据包添加首部,首部包含数据包的长度
2.将每个数据包封装成固定的长度
3.通过特殊符号设置边界

5、TCP分段与IP分片

TCP数据过大,则在传输层对TCP包进行分段,UDP不能像TCP一样自己进行分段,因此会在IP层分片
IP分片由网络层完成,也在网络层进行重组;TCP分段是在传输层完成,并在传输层进行重组.