1.如何让win系统发dscp报文
对于CoS和DSCP,只是分类的标准,可以自己设置信任哪个。
而且CoS和DSCP之间有映射,只是标识了包的优先级的不同, 根据包的优先级选择不同的出队列,不同出队列所占的带宽资源, 拥塞时丢弃比例不同。从而实现服务质量的目标。
QoS的实现以IETF 的DiffServ 体系为基础。 DiffServ体系规定每一个传输报文将在网络中被分类到不同 的类别,分类信息被包含在了IP 报文头中,DiffServ 体系使用了IP 报文头中的TOS(Type Of Service)中的前6 个比特来携带报文的分类信息。
当然分类信息也可以被携带在链路层报文头上。一般地, 附带在报文中的分类信息有: 1 帧头的Tag Control Information 中的前3 个比特,它包含了8 个类别的优先级信息,通常称这三个比特为为User Priority bits。
2 报文头中的TOS 字段前3 个比特,称作IP precedence value;或者携带在IP 报文头中的TOS 字段前6 个比特,称作Differentiated Services Code Point (DSCP) value。 在遵循DiffServ 体系的网络中, 各交换机和路由器对包含同样分类信息的报文采取同样的传输服务策 略,对包含不同分类信息的报文采取不同的传输服务策略。
报文的分类信息可以被网络上的主机、交换机、路由器或者其它网络设备赋予。 可以基于不同的应用策略或者基于报文内容的不同为报文赋予类别信 息。
2.如何连续接收udp报文
UDP包UDP报头由4个域组成,其中每个域各占用2个字节,具体如下:源端口号目标端口号数据报长度校验值 UDP协议使用端口号为不同的应用保留其各自的数据传输通道。
UDP和TCP协议正是采用这一机制实现对同一时刻内多项应用同时发送和接收数据的支持。数据发送一方(可以是客户端或服务器端)将UDP数据报通过源端口发送出去,而数据接收一方则通过目标端口接收数据。
有的网络应用只能使用预先为其预留或注册的静态端口;而另外一些网络应用则可以使用未被注册的动态端口。因为UDP报头使用两个字节存放端口号,所以端口号的有效范围是从0到65535。
一般来说,大于49151的端口号都代表动态端口。TCP包 每个tcp都包含源端口号和目标端口号,加上ip头中的源ip和目的ip,唯一确定一个tcp连接。
序号用来标识从tcp发端向tcp收端发送的数据字节流,它表示在这个报文段中的第一个数据字节。序号字段包含由这个主机选择的该连接的初始序号isn(Initial Sequence Number)。
该主机要发送数据的第一个字节,序号为isn+1,因为syn占用了一个序号。IP包 IPV4报头有12个必需的字段和可选IP选项字段,位于要发送的数据之前。
如果使用IP层已有的库或其他组件,一般不必考虑报头中的大多数字段,但程序代码需要提供源端和目的端地址。1、版本(4比特) IP协议版本已经经过多次修订,1981年的RFC0791描述了IPV4,RCF2460中介绍了IPV6。
2、报头长度(4比特) 报头长度是报头数据的长度,以4字节表示,也就是以32字节为单位。报头长度是可变的。
必需的字段使用20字节(报头长度为5,IP选项字段最多有40个附加字节(报头长度为15)。3、服务类型(8比特) 该字段给出发送进程建议路由器如何处理报片的方法。
可选择最大可靠性、最小延迟、最大吞吐量和最小开销。路由器可以忽略这部分。
4、数据报长度(16比特) 该字段是报头长度和数据字节的总和,以字节为单位。最大长度为65535字节。
5、标识符(16比特) 原是数据的主机为数据报分配一个唯一的数据报标识符。在数据报传向目的地址时,如果路由器将数据报分为报片,那么每个报片都有相同的数据标识符。
6、标志(3比特)标志字段中有2为与报片有关。 位0:未用。
位1:不是报片。如果这位是1,则路由器就不会把数据报分片。
路由器会尽可能把数据报传给可一次接收整个数据报的网络;否则,路由器会放弃数据报,并返回 差错报文,表示目的地址不可达。IP标准要求主机可以接收576字节以内的数据报,因此,如果想把数据报传给未知的主机,并想确认数据报没有因为大小的原 因而被放弃,那么就使用少于或等于576字节的数据。
位2:更多的报片。如果该位为1,则数据报是一个报片,但不是该分片数据报的最后一个报片;如果该位为0,则数据报没有分片,或者是最后一个报片。
7、报片偏移(13比特) 该字段标识报片在分片数据报中的位置。其值以8字节为单位,最大为8191字节,对应65528字节的偏移。
例如,将要发送的1024字节分为576和424字节两个报片。首片的偏移是0,第二片的偏移是72(因为72*8=576)。
8、生存时间(8比特) 如果数据报在合理时间内没有到达目的地,则网络就会放弃它。生存时间字段确定放弃数据报的时间。
生存时间表示数据报剩余的时间,每个路由器都会将其值减一,或递减需要数理和传递数据报的时间。实际上,路由器处理和传递数据报的时间一般都小于1S,因此该值没有测量时间,而是测量路由器之间跳跃次数或网段的个数。
发送数据报的计算机设置初始生存时间。9、协议(8比特) 该字段指定数据报的数据部分所使用的协议,因此IP层知道将接收到的数据报传向何处。
TCP协议为6,UDP协议为17。10、报头检验和(16比特) 该字端使数据报的接收方只需要检验IP报头中的错误,而不校验数据区的内容或报文。
校验和由报头中的数值计算而得,报头校验和假设为0,以太网帧和TCP报文段以及UDP数据报中的可选项都需要进行报文检错。11、源IP地址(32比特) 表示数据报的发送方。
12、目的IP地址(32比特) 表示数据报的目的地。
3.如何连续接收udp报文
UDP包UDP报头由4个域组成,其中每个域各占用2个字节,具体如下:源端口号目标端口号数据报长度校验值 UDP协议使用端口号为不同的应用保留其各自的数据传输通道。
UDP和TCP协议正是采用这一机制实现对同一时刻内多项应用同时发送和接收数据的支持。数据发送一方(可以是客户端或服务器端)将UDP数据报通过源端口发送出去,而数据接收一方则通过目标端口接收数据。
有的网络应用只能使用预先为其预留或注册的静态端口;而另外一些网络应用则可以使用未被注册的动态端口。因为UDP报头使用两个字节存放端口号,所以端口号的有效范围是从0到65535。
一般来说,大于49151的端口号都代表动态端口。TCP包 每个tcp都包含源端口号和目标端口号,加上ip头中的源ip和目的ip,唯一确定一个tcp连接。
序号用来标识从tcp发端向tcp收端发送的数据字节流,它表示在这个报文段中的第一个数据字节。序号字段包含由这个主机选择的该连接的初始序号isn(Initial Sequence Number)。
该主机要发送数据的第一个字节,序号为isn+1,因为syn占用了一个序号。IP包 IPV4报头有12个必需的字段和可选IP选项字段,位于要发送的数据之前。
如果使用IP层已有的库或其他组件,一般不必考虑报头中的大多数字段,但程序代码需要提供源端和目的端地址。1、版本(4比特) IP协议版本已经经过多次修订,1981年的RFC0791描述了IPV4,RCF2460中介绍了IPV6。
2、报头长度(4比特) 报头长度是报头数据的长度,以4字节表示,也就是以32字节为单位。报头长度是可变的。
必需的字段使用20字节(报头长度为5,IP选项字段最多有40个附加字节(报头长度为15)。3、服务类型(8比特) 该字段给出发送进程建议路由器如何处理报片的方法。
可选择最大可靠性、最小延迟、最大吞吐量和最小开销。路由器可以忽略这部分。
4、数据报长度(16比特) 该字段是报头长度和数据字节的总和,以字节为单位。最大长度为65535字节。
5、标识符(16比特) 原是数据的主机为数据报分配一个唯一的数据报标识符。在数据报传向目的地址时,如果路由器将数据报分为报片,那么每个报片都有相同的数据标识符。
6、标志(3比特)标志字段中有2为与报片有关。 位0:未用。
位1:不是报片。如果这位是1,则路由器就不会把数据报分片。
路由器会尽可能把数据报传给可一次接收整个数据报的网络;否则,路由器会放弃数据报,并返回 差错报文,表示目的地址不可达。IP标准要求主机可以接收576字节以内的数据报,因此,如果想把数据报传给未知的主机,并想确认数据报没有因为大小的原 因而被放弃,那么就使用少于或等于576字节的数据。
位2:更多的报片。如果该位为1,则数据报是一个报片,但不是该分片数据报的最后一个报片;如果该位为0,则数据报没有分片,或者是最后一个报片。
7、报片偏移(13比特) 该字段标识报片在分片数据报中的位置。其值以8字节为单位,最大为8191字节,对应65528字节的偏移。
例如,将要发送的1024字节分为576和424字节两个报片。首片的偏移是0,第二片的偏移是72(因为72*8=576)。
8、生存时间(8比特) 如果数据报在合理时间内没有到达目的地,则网络就会放弃它。生存时间字段确定放弃数据报的时间。
生存时间表示数据报剩余的时间,每个路由器都会将其值减一,或递减需要数理和传递数据报的时间。实际上,路由器处理和传递数据报的时间一般都小于1S,因此该值没有测量时间,而是测量路由器之间跳跃次数或网段的个数。
发送数据报的计算机设置初始生存时间。9、协议(8比特) 该字段指定数据报的数据部分所使用的协议,因此IP层知道将接收到的数据报传向何处。
TCP协议为6,UDP协议为17。10、报头检验和(16比特) 该字端使数据报的接收方只需要检验IP报头中的错误,而不校验数据区的内容或报文。
校验和由报头中的数值计算而得,报头校验和假设为0,以太网帧和TCP报文段以及UDP数据报中的可选项都需要进行报文检错。11、源IP地址(32比特) 表示数据报的发送方。
12、目的IP地址(32比特) 表示数据报的目的地。
4.如何在WINDOWS环境下实现原始UDP数据包发送..请高手解答,送分
我有个VC++语言的Socket程序不过IP协议是6的,给你看2个关键函数void CMy6dDlg::OnButton1() //建发送SOCKET{ memset(&hints,0,sizeof(hints)); //hints.ai_family=PF_UNSPEC; hints.ai_family=AF_INET6; hints.ai_socktype=SOCK_DGRAM; hints.ai_protocol=IPPROTO_UDP; hints.ai_flags=AI_NUMERICHOST; rc=getaddrinfo((LPCTSTR )m_send,"2000",&hints,&res);//解析本机发地址 if(rc!=0) { AfxMessageBox("fail"); return; } s_send=socket(res->ai_family,res->ai_socktype,res->ai_protocol);//建本机发地址 if(s_send==INVALID_SOCKET) {AfxMessageBox("建本机发socket失败");return ;} else { AfxMessageBox("建本机发socket成功"); //绑定本地监听端口bind if(bind (s_send,res->ai_addr,res->ai_addrlen)==SOCKET_ERROR) //fprintf(stderr,"bind() failed with error %d: %s\n",WSAGetLastError(), DecodeError(WSAGetLastError())); AfxMessageBox("bind失败"); else { AfxMessageBox("bind成功"); GetDlgItem(IDOK)->EnableWindow (TRUE); } //printf("bind ok\n"); } if ( WSAAsyncSelect( s_send, m_hWnd, UM_PACKET, FD_READ ) == SOCKET_ERROR ) { MessageBox( "WSAAsyncSelect failed" ); closesocket( s_send ); return; }}void CMy6dDlg::OnOK() { // TODO: Add extra validation here //发送消息 UpdateData(TRUE); memset(&hints,0,sizeof(hints)); //hints.ai_family=PF_UNSPEC; hints.ai_family=AF_INET6; hints.ai_socktype=SOCK_DGRAM; hints.ai_protocol=IPPROTO_UDP;//这里也可以改为0,让系统自己选 hints.ai_flags=AI_NUMERICHOST; rc=getaddrinfo((LPCTSTR )m_receive,"2000",&hints,&res);//解析对方收地址 if(rc!=0) { AfxMessageBox("fail"); return; } rc=sendto(s_send,m_sendtxt,m_sendtxt.GetLength(),0,res->ai_addr,res->ai_addrlen); if (rc== SOCKET_ERROR) { //fprintf(stderr, "send() failed: error %d: %s\n",WSAGetLastError(), DecodeError(WSAGetLastError())); AfxMessageBox("发送失败"); closesocket(s_send); } else { AfxMessageBox("发送成功"); }}具体的你可以参考Socket。
5.用UDP实现可靠传输
如何用vb的winsocket解决udp文件传送丢包的问题 udp协议是1种无连接的协议,他和tcp协议比较有传输速度快,占用资源少的问题。
但是由于udp协议本身没有自动找包的功能,因此经常会出现丢包的现象,会造成传送的文件丢包的现象 因为时间匆忙和水平有限,本人在效率上没有作优化,只是简单的实现,请大家自己看源码吧 注释: 主要功能:把文件猜成4k大小的包 在包头+上包的长度 接受了1个包判断长度是否和接受的长度相符如果 符合那么就继续发,如果出现丢包那么就从发 希望大家有什么好的建议通知我,我会尽量完善的 Option Explicit '============================================== '=============================== 'udp传文件 '客户端 '作者: 影子 '================================ '============================================== Dim FileNumber As Integer '用来存文件的句柄 Dim LenFile As Long '文件的长度 Private Sub Command2_Click() closefile End Sub Private Sub Form_Load() Winsock0.LocalPort = 5698 Winsock0.Bind beginfile End Sub Private Sub Winsock0_DataArrival(ByVal bytesTotal As Long) Dim FileByte() As Byte Winsock0.GetData FileByte, vbArray + vbByte '接收类型为:字节数组 Dim mendByte() As Byte, i As Long, j As Long Dim temp As String, temp1 As String '获得包长 j = UBound(FileByte) '合并包头 For i = 0 To 7 Step 2 temp = temp & Chr(FileByte(i)) Next '比较长度看丢包没有 If Val(temp) = j Then ReDim mendByte(j - 8) ' 提出包头 For i = 0 To j - 8 mendByte(i) = FileByte(i + 7) Next ' 写文件 Put #FileNumber, , mendByte ' 发送继续发送的请求 frmmain.Winsock0.SendData "ok" Else '出现丢包,请求重发 frmmain.Winsock0.SendData "no" End If End Sub Public Sub beginfile() FileNumber = FreeFile '取得未使用的文件号 Open "c:\aaa.exe" For Binary As #FileNumber '打开文件 End Sub Public Sub closefile() '关闭文件句柄 Close #FileNumber End Sub Option Explicit Dim GetFileNum As Integer Dim LenFile As Long Dim Sendbaye() As Byte '发送的包 '=============================== 'udp传文件 '作者: 影子 '服务器端 '================================ Private Sub Command1_Click() GetFileNum = FreeFile '取得未使用的文件号 LenFile = FileLen("d:\aa.rar") '获得需传送的文件的长度 Open "d:\aa.rar" For Binary As #GetFileNum '打开需传送的文件 Command1.Enabled = False ' 传送文件 Call TCPSendFile(frmmain.Winsock0, GetFileNum, SplitFile) Text1.Text = Now End Sub Private Sub Form_Load() frmmain.Winsock0.RemoteHost = "192.168.0.12" '服务器ip frmmain.Winsock0.RemotePort = 5698 End Sub '========================================================================= '为了清晰,下面分别用两个子过程来完成计算这次还可以传多少个字节的数据和传送数据 '========================================================================== Private Function SplitFile() As Long '拆包 On Error Resume Next Dim GetCount As Long '计算出这次可发送的字节数 If LenFile >= 4000 Then GetCount = 4000 LenFile = LenFile - GetCount Else GetCount = LenFile LenFile = LenFile - GetCount End If SplitFile = GetCount End Function Private Sub TCPSendFile(objWinSock As Winsock, FileNumber As Integer, SendLen As Long) Dim FileByte() As Byte, i As Long, j As Long Dim temp As String ReDim Sendbaye(0) Dim tempa As String * 4 ReDim FileByte(SendLen - 1) tempa = SendLen + 7 Sendbaye = tempa ' 把长度负值给包头 Get #FileNumber, , FileByte '读取文件 ReDim Preserve Sendbaye(SendLen + 7) '把包头+到文件头 For i = 0 To UBound(FileByte) Sendbaye(i + 7) = FileByte(i) Next frmmain.Winsock0.SendData Sendbaye End Sub Private Sub Winsock0_DataArrival(ByVal bytesTotal As Long) Dim str As String frmmain.Winsock0.GetData str Select Case str Case "ok" '成功继续发送 If LenFile = 0 Then '发送完成 MsgBox "成功" Exit Sub End If Call TCPSendFile(frmmain.Winsock0, GetFileNum, SplitFile) Case "no" '不成功重发上一个包 frmmain.Winsock0.SendData Sendbaye End Select End Sub 参考资料:/s?wd=zyg0 udp。
6.UDP报文最短长度 求告
如果是以太网
TCP:
以太网帧首部 14byte
IP头 20byte
TCP头 20byte
填充 (6byte)
以太网帧尾部 4byte
一共58byte 不够64byte需要填充6byte
UDP:
以太网帧首部 14byte
IP头 20byte
UDP头 8byte
填充 (18byte)
以太网帧尾部 4byte
一共46byte 不够64byte需要填充18byte
转载请注明出处windows之家 » win10用UDP如何发送长帧报文