IP首部有一个协议字段,用来标识网络层的上一层所采用的是哪一种传输层协议。根据这个字段的协议号,就可以识别IP传输的数据是TCP的内容还是UDP的内容。
TCP/IP的大多数协议都是以客户端/服务器端的形式运行,客户端类似于客户的意思,是请求的发起端,服务器端则是表示提供服务的意思,是请求的处理端。另外,服务器应该提前启动,准备接受客户的请求。
服务端程序在UNIX系统当中叫做守护进程。例如HTTP的服务端程序是httpd,ssh的守护进程是sshd。在UNIX系统中不需要将这些所有的守护进程逐个启动,而是启动一个可以代表它们接收客户端请求的inetd(互联网守护进程)服务程序即可。它是一种超级守护进程,收到客户端请求后会创建新的进程并转换为sshd等个守护进程。
确认一个请求进程是发给哪个服务器,可以通过收到的数据包的目标端口号轻松识别。
数据链路层和IP中的地址,分别是MAC地址和IP地址。前者用来识别同一链路中不同的计算机,后者用来识别TCP/IP网络中互连的主机和路由器。在传输层中也有地址,就是端口号。端口号用来识别同一台计算机中进行通信的不同应用程序,也被称为程序地址。
TCP/IP或UDP/IP通信通常采用5个信息来识别一个通信。分别为:源IP地址、目标IP地址、协议号、源端口号、目标端口号。
范围 | 端口号 |
---|---|
0~1023 | 熟知端口号 |
1024~49151 | 注册端口号 |
49152~65535 | 临时端口号 |
端口号 | 服务进程 | 说明 |
---|---|---|
53 | DNS | 域名服务 |
67/68 | DHCP | 动态主机配置协议 |
69 | TFTP | 简单文件传送协议 |
161/162 | SNMP | 简单网络管理协议 |
520 | RIP | 路由信息协议 |
端口号 | 服务进程 | 说明 |
---|---|---|
20 | FTP | 文件传输协议(数据连接) |
21 | FTP | 文件传输协议(控制连接) |
22 | SSH | 安全登录 |
23 | TELNET | 网路虚拟终端协议,例如telnet |
25 | SMTP | 简单邮件传输协议 |
80 | HTTP | 超文本传输协议 |
179 | BGP | 边界路由协议 |
可以使用以下命令,看到知名端口号
所以在写程序的时候,要避开这些知名端口号。
端口号+IP=套接字,IP表示目标电脑的地址,端口表示目标电脑操作系统上的进程。所以套接字可以唯一标识一个进程,如果一个端口被多个程序绑定,那么就不知道数据该发送给谁。所以,一个端口是不能被多个进程绑定的。但是,一个进程可以绑定多个端口,不同的端口连接不同的服务器程序,已提供不同的服务。
功能:是用来查看网络状态的。
语法:netstat [选项]
选项 | 含义 |
---|---|
n | 拒绝显示别名,能显示数字的全部转化为数字 |
l | 仅列出有在监听的服务状态 |
p | 显示建立相关链接的程序名 |
t | 仅显示tcp相关选项 |
u | 仅显示udp相关选项 |
a | 显示所有选项,默认不显示LISTEN相关 |
功能:通过进程名,查看进程id
语法:pidof [进程名]
不带xargs,默认从标准输入或管道中读取数据,所以不能杀死。
若加上xargs,表示从命令行参数读取,相当于kill -9 ID。
UDP报文格式:
说明:
16位的UDP长度,表示整个数据报的最大长度。
UDP校验和用来检验整个用户数据报、UDP报头与伪报头在传输的过程中是否出现差错。
伪报头是在计算时加上的,只在计算的时候起作用,包含的有:IP分组头的源地址、目的IP地址、协议字段和UDP长度。若无伪报头,校验的对象只是UDP报文,若IP分组头出错,那么分组可能会传到错误的主机。
不需要建立连接,直接进行数据传输。
没有确认、重传机制,如果检到收到的分组出错,就丢弃该分组。
不能够灵活的控制读写数据的次数和数量。应用层交给UDP多长的报文,UDP原样发送,既不会拆分,也不会合并。
其实,UDP没有真正意义上的发送缓冲区,调用sendto会直接交给内核,由内核将数据传给网络层协议进行后续的传输。
UDP有接收缓冲区,但不能保证收到的UDP报的数据和发送的顺序一致。如果缓冲区满,则再到达的数据就被丢弃。
UDP是全双工的,读写可以同时进行。
但是UDP有16位的数据,最大长度是2^16=64K,在当今的互联网环境下,是一个非常小的数字。如果需要传输的数据超过64K,就需要在应用层手动的分包,多次发送,并在接收端手动拼装。
NFS:网络文件系统
TFTP:简单文件传输协议
DHCP:动态主机配置协议
BOOTP:启动协议(无盘启动)
DNS:域名解析协议
表示发送端端口号,字段长为16位。
表示接收端口号,字段长为16位。
表示发送数据的位置,字段长为32位。每发送一次数据,就累加一次该数据字节数的大小。
注意:序列号不会从0或1开始,而是在建立连接时由计算机生成的一个随机数作为其初始值,通过SYN包发送给接收端主机。然后再将每转发过去的字节数累加到初始值上表示数据的位置。
表示下一次应该收到的数据的序列号,字段长为32字节。发送端收到这个确认应答以后可以认为在这个序号以前的数据都已经被正常接收。
(1)保证报文按序到达。
(2)保证可靠性。
(3)保证效率。
(4)精准的报告哪些报文已经收到,哪些需要重传。
该字段长度为4位,单位为4字节(32位)。TCP首部长度不包括选项的话,是20个字节,20/4=5,5的二进制序列:0101,报头长度也叫数据偏移,所以该字段可以设置为5,选项字段最大的是40字节,所以,TCP首部长度为最大为20+40=60字节,该字段可以设置的最大长度为60/4=15。
该字段主要是为了以后扩展时使用,其长度为4位。一般设置为0,即使收到的包在该字段不为0,此包也不会丢弃。
字段长为6,每一位从左到右分别为:URG、ACK、PSH、RST、SYN、FIN。当对应的值为1,表示有具体含义。
字段 | 含义 |
---|---|
URG | 紧急指针是否有效。为1,表示某一位需要被优先处理。 |
ACK | 确认号是否有效,一般置为1。 |
PSH | 提示接收端应用程序立即从TCP缓冲区把数据读走。 |
RST | 对方要求重新建立连接,复位。 |
SYN | 请求建立连接,并在其序列号的字段进行序列号的初始值设定。建立连接,设置为1. |
FIN | 希望断开连接。 |
接收缓冲区的大小,TCP不允许发送超过此处所示大小的数据。
发送端填充,CRC校验,接收校验不通过,则认为数据有问题。和UDP的区别是,UDP校验的是数据本身,TCP校验的不仅包含TCP首部,而且包含TCP数据部分。
只有在URG为1时有效,该字段为1表示本报文的段中的紧急数据的指针。
用于提高TCP的传输性能。需要根据首部长度进行控制,其最大长度为40字节。