一. 分层模型
tcp/ip 是一个庞大得协议族,是众多协议的集合,包括 dns http mqtt tcp udp ip等,将这些协议划分为不同层次。
协议层报文间的封装与拆封
封装:应用数据沿着协议栈 ,从tcp ip 以太网驱动驱动传递,在传递过程中,会一次加上tcp,ip,以太网头部信息,也就是封装。
拆封:当设备网卡接收到一个数据包时,会通知tcp/ip内核,会将其从缓存中取出,并逐层解析数据包中头部信息,最终将数据传到应用程序。
二. TCP协议
tcp协议是为应用层提供可靠的,面向连接,基于流的一种传输服务。
tcp特性:
1.连接机制:在发送前,双方必须建立连接,必须有双方的ip和端口。
2.确认和重传:1发送給2数据后,2会发送给1的一个接收的结果,1必须等待该结果,如果超过时间没有收到通知,1就会重传。
3.缓冲机制:tcp提供一个缓冲机制,当数据过小时,tcp会将其存储到缓冲中,当数据足够时才能发送,此外发送完也不会立即删除数据,而是等到接收方确认收到的通知。
4.全双工通信:双方是对等的,能够互传。
5.流量控制:发送速率和读取速率不匹配,发送方会通知接收窗口来实时调整发送速度。
6.差错机制:通过校验和的方式来验证数据的有效性.
7.拥塞机制:当数据从一个大的管道(如一个快速局域网)向一个较小的管道(如一 个较慢的广域网)发送时便会发生拥塞。tcp会降低发送方的发送速度。
tcp报文结构:
tcp报文分为首部+数据区域
1. 源端口和目标端口结合ip协议中的双方ip地址就是整个tcp所需要ip和端口号。
2. 序号用来标志数据字节流区域。其值为数据中的第一个字节的位置,后根据数据区域的长度,就可以推断出整个字节流的区域。
3. 确认序号:用于指示发送方期望接收下一个字节的序号。
4. 首部长度:占据4bit空间,用以表示报文首部长度。
5. 标志位:URG: 有无紧急数据
ACK: 确认序号中的值是否有效
PSH: 指示接收方接收数据后是立即发给应用程序,而不是在缓冲区等待。
RST: 重置连接
SYN: 用于建立连接
FIN: 用于关闭连接
6. 窗口大小:之前聊过流量控制的接收窗口。
7. 校验和:验证数据完整性
8. 紧急指针,只有urg 标志位为1,才有效,指向紧急数据的末尾位置。
tcp协议通信双方必须先建立起tcp连接,当结束通信,关闭连接。
三次握手,四次挥手
三次喔手 :当服务端与客户端建立连接时,需要双方总共发送3个包。
客户端将syn标志位为设为1,并产生随机值seq,并将数据包发送给server,之后处于等待位。
服务端接受后,通过syn标志位知道客户端请求连接,将syn和ack只为1,产生一个随机seq值,将数据包发送给client ,之后等待位。
客户端收到数据包,检查ack是否为1,如果正确则将ack标志位值位1,再次发送给服务端,服务端再次检查该标志位,如果为1,则正式建立起连接。
四次挥手:tcp连接删除时,需要发送4个包。服务端和客户端均可发起挥手动作,在socket编程中,双方均可利用close来关闭。
二. udp协议 与socket
udp协议和tcp相反,会应用层提供一种不可靠,无连接,基于数据报的传输服务。
socket 是一种文件描述符,linux网络编程通过socket接口实现。
套接字类型:
我们一般使用sockaddr_in 结构体来填入服务端以及客户端的ip 端口 地址族等信息
三. TCP与udp 编程步骤
tcp 服务端
1. 创建一个套接字 socket
2. 将服务器的ip 端口号,用bind函数绑定
3. listen()函数 设置监听队列,允许最大的连接数
4. accept函数,允许哪个ip 端口的客户端,能连接上来
5. 收发数据 read/recv or read/write
6. 关闭连接
tcp 客户端
1. 创建一个套接字 socket()
2.设定要去连接的服务器ip端口等,再用connect()连接
3.收发数据
4.关闭连接