OSI参考模型: TCP/IP参考模型:
----------------------------------------------------------
应用层 应用层 数据段
表示层
会话层
-----------------------------------------------------------
传输层 传输层 数据包
-------------------------------------------------------------
网络层 网络互联层 数据帧
-------------------------------------------------------------
数据链路层 网络接口层 比特
物理层
-------------------------------------------------------------
网络接口层:负责将二进制流转换成数据帧,并进行数据帧的发送和接受。
网络层:负责将数据帧封装成IP数据报,同时负责选择数据报的路径,即路由。
传输层:负责端到端之间的通信会话的建立与链接。
应用层:负责应用程序的网络访问,这里通过端口号来识别各个不同的进程。
TCP/IP协议实际是一个协议族,可分为三部分:
一、网络层,包括:
1、Internet协议(IP)
2、网际控制报文协议(IC-MP)
3、地址识别协议(ARP)
二、传输层协议,包括:
1、传输控制协议(TCP):TCP应为应用程序存取网络创造条件,使用可靠的面向连接的传输层服务
2、用户数据报文协议(UDP):UDP提供不可靠的非连接型传输层服务,它允许在源和目的地站点之间传送数据,而不必在传送数据之前建立对话。
该协议不使用TCP使用的 端对端差错校验。
三、应用程序部分,包括:
Telnet、文件传输协议(FTP和TFTP)、简单的文件传输协议(SMTP)和域名服务(DNS)等协议。
TCP协议
TCP协议处于传输层,实现了从一个应用程序到另一个应用程序的数据传递。应用程序通过目的地址和端口号来区分接收数据的不同应用程序。
数据包格式:
--------------------------------------------------------------
16位源端口号 16位目的端口号
32位序列号
32位确认号
4位首部长度 保留6位 6位标志字段 16位窗口大小
16位校验和 16位紧急指针
-----------------------------------------------------------------
选项
数据
-----------------------------------------------------------------------
序号字段的值:指的是本报文所发送的数据的第一个的序号。
确认号字段:是指期望收到对方的下一个报文段的数据的第一个字节的序号
shoubuchangdu
6个标志字段:
URG
ACK
PSH
RST
SYN:同步比特
FIN:终止比特
窗口字段用来控制对方发送的数据量,单位为字节
校验和字段:校验的范围包括首部和数据这两部分
TCP连接建立的过程:
TCP协议通过3次握手来初始化,目的是使数据段的发送和接收同步,告诉其他主机其一次可接收的数据量,并建立连接。
SYN J
-------------------->
SYNK,ACK J+1
客户机 <-------------------- 服务机
ACK K+1
-------------------->
UDP协议
数据包格式:
------------------------------------------------------
16位源端口号 16位目的端口号
16位用户包长度 16位校验和
---------------------------------------------------
数据
--------------------------------------------------
源端口号:UDP数据包的发送方使用的端口号
目的端口号:UDP数据包的接收方使用的端口号
数据包长度:数据包长度是指包括包头和数据部分在内的总字节数
校验值:UDP协议使用包头中的校验值来保证数据的安全
UDP协议是一种无连接的协议,因此不需要像TCP那样通过3次握手来建立一个连接。同时,一个UDP应用可同时作为应用的客户或服务器方。
TCP通信过程
一个典型的通信过程如下:
服务器端 客户端
socket socket ------
↓ ↓ |
bind bind |
↓ |
listen ↓ |
↓ |
accept <---------- connect <----
↓ ↓
recv/recvfrom <---- send/sendto
↓ ↓
send/sendto -----> recv/recvfrom
↓ ↓
close close
工作过程如下:
首先服务器启动,通过调用socket()建立一个套接字;然后调用bind()将该套接字和本地网络地址联系在一起,在调用listen()使套接字做好侦听的准备,并规定他的请求队列的长度;之后就调用accept()来接受连接。连接一旦建立,客户机和服务器之间就可以通过调用read()和write()来发送和接收数据。最后,待数据传送结束后,双方调用close()关闭套接字。
1、使用socket()创建套接字
为了建立Socket,程序可以调用Socket函数,该函数返回一个类似于文件描述符的句柄。
2、使用bind()绑定本地地址
bind函数将Socket与本机上的一个端口相关联,随后即可在该端口监听服务请求。使用bind()函数,绑定套接字到一个IP地址和一个端口上。
3、listen()函数
使用listen()函数将套接字设置为监听,以等待连接请求。
4、accept()函数
一般就使用accept()函数来响应连接请求,建立连接并产生一个新的socket描述符来描述该连接,该连接用来与特定的客户端交换信息。
accept()函数默认为阻塞函数,调用该函数后,将一直阻塞直到用连接请求。
5、connect()函数
客户端如果需要申请一个连接,必须调用connect()函数,这个函数的任务就是建立与服务器的连接。
客户端调用connect()函数来连接服务器,这个函数将启动TCP协议3次握手并建立连接。
当connect()调用成功之后,就可以使用sockfd作为与服务器连接的套接字描述符,接下来就可以使用I/O函数,如read()、write()、send()和recv()等进行数据传输了。
6、数据通信
send()和recv()函数:TCP通信时使用
sendto()和recvfrom()函数:UDP通信时使用
7、使用close()函数关闭当前的连接