Unix网络编程(二)传输层UDP,TCP协议

总图
tcpdump网络应用-----BSD分组过滤器(BPF)或者数据链路提供接口(DLPI)----------->数据链路层
ARP/RARP------------>数据链路层
1)IPv4应用程序 AF_INET sockaddr_in{}:
mroute----------IGMP-------------------->IPv4
ping------------ICMP--------------------------->IPv4
traceroute------直接访问或者ICMP----------->IPv4
应用----------TCP,SCTP,UDP------------>IPv4
2)IPv6应用程序 AF_INET6 sockaddr_in6{}:
traceroute------直接访问或者ICMP6---------->IPv6
ping------------ICMP6------------------>IPv6
应用----------TCP,SCTP,UDP------------>IPv6

每个协议框:
IPv4(32位地址),IPv6(128位地址):为TCP,UDP,SCTP,ICMP,IGMP提供分组递送服务.
TCP(传输控制协议):面向连接,提供可靠全双工字节流.是一种流套接字,关心确认,超时,重传的细节.
UDP(用户数据报协议):无连接.是一种数据报套接字,不能保证数据报最终到达它们的目的地.
STCP(流控制传输协议)
ICMP(网际控制消息协议)
IGMP(网际组管理协议)
ARP(地址解析协议) IPv4---->硬件地址
RARP(反向地址解析协议)  硬件地址---->IPv4
ICMP6(网际控制协议版本6)
BPF(BSD分组过滤器):提供对数据链路层的访问能力,通常在Berkeley内核中
DLPI(数据链路提供者接口):提供对数据链路层的访问能力,通常由SVR4内核提供
所有网际协议由一个或多个成为请求评注(RFC)的文档定义,这些RFC就是他们的正式规范

用户数据报协议(UDP)
应用程序往UDP套接字写入一个消息,该消息随后被封装成UDP数据报,然后被封装成IP数据报,最后到达目的地.
UDP协议不保证数据报一定到达目的地,不保证数个数据报跨网络传输后顺序保持不变,不保证每个数据报只到达一次.
UDP编程最大的问题在于它的不可靠性,如果一个数据报到达其目的地后,校验和检测发现其有错误,或者在网络传输中被丢弃了,它就无法传递给对端套接字,也不会被源自动重传.如果想要确认数据报到达目的地,可以给应用程序添加一堆的特性:来自对端的确认,本端的超时与重传.
UDP数据报到达时会有一个数据报长度随数据报内容一起传递给对端应用程序,而TCP是没有边界的,它是字节流协议.
UDP是无连接的协议,因为它与服务器不存在任何长期的连接关系.客户端可以使用套接字向服务器发送一段数据报,然后立即使用这个套接字向另一个服务器发送一段数据报。同样的,一个UDP服务器可以使用一个套接字接收多个不同客户端的数据报.

传输控制协议(TCP)
1)首先TCP为客户和服务器之间提供一个连接;
2)TCP为客户和服务器提供可靠的数据传输.(确认机制),从一定意义上讲,TCP不能保证数据一定到达,这是不可能的.但是它有超时重传机制以及故障报告.所以更准确的说,TCP提供的是可靠的数据投递和故障报告.
3)TCP有一套RTT估算算法,来计算等待一个确认需要多少时间;
4)TCP通过对每个字节添加一个序列来对数据进行排序.
5)TCP提供流量控制(通告窗口)
6)TCP提供全双工字节流,在一个套接字上收发数据.建立一个双工连接后,我们可以把它转换为单工的.

TCP连接的建立和终止

三路握手



1.服务器调用socket,bind,listen等待客户端连接请求,称为被动打开;
2.客户端调用socket,connect,发送一个SYN J(初始序列)同步分节,称为主动打开,此时connect函数调用阻塞.
(通常SYN分节不携带数据,其IP数据包只含有一个IP首部,一个TCP首部及可能有的TCP选项)
3.服务器端调用accept获取SYN分节,发送一个ACK J+1(在客户端发送的初始序列+1)确认,并也发送一个自己的SYN K(服务器端初始序列).
4.客户端connect返回,并发送一个服务器端的确认ACK K+1(服务器端初始序列+1).服务器accept返回。连接建立.

TCP选项
MSS选项:发送SYN的TCP一段使用它通告对端它的最大分节大小.(TCP_MAXSEG)
   窗口规模选项(SO_RCVBUF)
   时间戳选项:无需考虑

TCP连接终止 四路挥手


     
1)首先有一方调用close函数,称为主动关闭.向对端发送一个FIN M.
2)接收方对FIN进行确认(发送ACK M+1),并且收到最后一个数据为文件结束符(end-of_file).
表示对方无数据再发.
3)接收方调用close,向发起方发送一个FIN N.
4)主动关闭方发送一个确认(ACK N+1)
在2,3步骤之间,在主动关闭方和被动关闭方之间流动数据是可能的,这称为半关闭.
一般是客户端主动关闭,但并不是一定的.

TCP状态转换图



11种TCP状态可以用netstat显示,它是一个在调试客户/服务器应用时很有用的工具.
TCP连接的分组交换


TIME_WAIT状态
主动关闭方会经历TIME_WAIT状态,它在这个状态持续的时间是最长分节生命期(maximum segment lifetime,MSL)的两倍,有时候称之为2MSL.
具有最大跳限IP数据报分组在网络中存在的时间不可能超过MSL秒.TCP必须能够正确处理迷途的分组.
TIME_WAIT存在的两个理由:
1)可靠的实现TCP全双工连接的终止.
假设服务器的ACK丢失了,客户如果不维持它的状态信息,将相应一个RST,该分解将被服务器解释为一个错误.所以执行主动关闭的那一端有可能不得不重传ACK.
2)允许老的重复的分组在网络中消逝.
确保每个一个TCP连接成功建立时,老的来自该连接先前化身的重复分组已经在网络中消逝了.

 端口号
服务器众所周知的端口号:
FTP:21 TFTP(简化文件传送协议):69
客户端使用临时端口号(传输层协议自动赋予客户,并保证其唯一性)
IANA端口号三个分段:
1)0~1023众所周知的端口号
2)已登记的端口号1024~49151
3)49152~65535动态或者私用的.
套接字对 
一个TCP连接的套接字对是一个定义该连接两个端点的四元组:本地IP地址,本地TCP端口号,外地IP地址,外地TCP端口号.该套接字对唯一表示一个TCP连接.
缓冲区大小及限制
影响IP数据报(IP层)大小的限制
IPv4数据报的最大大小是65535字节,包括IPv4首部.(16位,2字节)
IPv6数据报的最大大小是65575字节,包括40字节的IPv4首部.因为IPv6净荷长度占据16位.(65535+40)
MTU:一种通信协议在某一个层所能通过最大数据包的大小,以字节为单位.1500字节的以太网MTU是当今最常见的路径MTU.
两个主机之间路径中最小的MTU称为路径MTU,当一个IP数据报大小超过相应链路的MTU,会将其分片.IPv4首部的不分片位DF若被设置,路由器接收到超过其外出链路MTU时,将产生一个ICMPv4(目的地不可达,需分片但DF位已被设置)出错消息.
最小重组缓冲区大小(IPv4和IPv6的任何实现必须保证支持的最小数据报大小,当数据报不大于这个时,肯定不分片.),IPv4为576字节,IPv6为1440字节.因为TCP协议含有MSS值设置,来保证不分片.而UDP没有此机制,所以UDP程序要避免产生大于这个值的数据报
TCP有个MSS,用于向对端通告对端在每个分节中能发送的最大TCP数据量.MSS的目的是告诉对端其重组缓冲区大小的实际值,从而试图避免分片.MSS经常设置成MTU减去IP和TCP首部的固定长度.以太网IPv4的MSS值1460,IPv61440.因为两者TCP首部都是20字节,而IPv4首部20字节,IPv6首部40字节.
TCP的MSS选项中,MSS值是一中个16位字段,限定其最大值为65535,对于IPv4,是合适的。因为TCP最大数据量MSS为65535-20-20 = 65495.
对于没有特大净荷长度的IPv6,MSS = 65575-40-20 = 65515.
而65535这个最大MSS值只有特大净荷的IPv6才用到.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值