TCP
源端口号和目的端口号:各占两个字节分别写入源端口号和目的端口号序号:占4个字节,序号范围是(1,2^32-1),共2^32个序号,当序号增加到2^32-1时,下一个序号就会回到0。用来标识从TCP源端向TCP目标端发送的数据字节流,它表示在这个报文段中的第一个数据字节。确认序号:是期望收到对端下一个报文段的第一个数据字节的序号头部长度:占4位,TCP报文短的首部长度,最大60,没有用选项是20.预留:由跟在数据偏移字段后的6位构成,预留位通常为0.标志位: URG:紧急指针(urgent pointer)有效 ACK:确认序号有效 SYN:发起一个连接 RST:重置 连接,当RST位置为1后说明TCP链接中出现严重问题,必须释放连接然后重新建立 PSH:在要求键入一个命令时,无需等待就立即要收到对方的兴颖时,使用PSH位,将PSH位置为1后,接收方不等缓冲区填满就向上交付数据。 FIN:关闭连接标志位窗口大小:占两个字节,指的是发送本报文段的一方的接收窗口大小,表明接收方允许对方发送的数据量。校验和:采用CRC校验。紧急指针:紧急指针仅在URG=1时才有效,指出本报文段中的紧急数据的字节数(也就是紧急数据的末尾在报文段中的位置),窗口为0时也可发送紧急数据。URG(紧急位):当URG=1的时候,紧急指针有效。紧急指针是一个正的 偏移量,和序号字段中的值相加表示紧急数据最后一个字节的序号。TCP的紧急方式是从发送端向另一发送发送紧急数据的方式。数据从第一个字节到紧急指针所指字节就是紧急数据。数据段中的紧急数据不进入缓冲区就直接交给上层进程,而余下数据则要进入接收缓冲区。 PSH(急迫位):PSH=1时,客户端发送给服务器的报文段立即被服务器TCP交付给应用进程处理,而不用再等整个缓存都填满之后再向上交付。一般情况下,TCP等缓冲区写满之后才向上提交给应用进程,注意PSH=1时数据还是要从缓冲区向上提交的,只是不用再等到缓冲区满了之后再向上提交
超时重传:
为每个TCP报文段都维护一个重传定时器,定时器在TCP报文段都维护一个重传定时器,定时器在TCP报文段第一次被发送时启动,如果超时时间内未收到应答,则重传报文段并重置定时器。
确认相应
对于一个收到的请求都将发送一个确认
首部校验
由发送端填充16位校验和,接收端进行CRC校验,及教研TCP头部,又校验数据。
对接收到的数据进行排序
丢弃重复数据
流量控制
TCP通过窗口的大小进行流量控制,防止接收慢的主机缓冲区溢出
面向字节流,不对数据解析,防止报文被截断保活定时器
保活计时器用来防止两个TCP之间的连续出现长时间的空闲。 假定客户已主动与服务器建立了TCP链接。然后这个客户端出现故障。在这种情况下,这个链接就会永远的处于打开状态。而服务器维护一个链接,也是要耗费一定的资源的,所以必须采取措施,使服务器不能白白等下去。 要解决这种问题,就要对服务器设置保活计时器。每当服务器收到客户的信息,就将计时器复位,保活时间通常设置为2小时。若服务器过了两小时还没有收到客户的信息,他就发送一个探测报文,以后每隔75秒就发一次,连续发送10个探测报文后客户端仍然没有响应,服务器就认为客户端出现了故障,接着就关闭这个链接。http长连接时会用到
超时重传定时器
当TCP发送报文段时就创建超时重传定时器,若在时间到之前收到了对应端的回应消息则撤销定时器,否则若超过时间还没有收到则认为发送的报文对端没有收到,然后重新发送报文,并重置定时器
坚持定时器
假设TCP收到了一个窗口大小为0报文段,发送TCP就停止传送报文段,直到接收TCP发送一个非零的窗口大小。但是这个非零窗口大小的确认,有可能丢失,若确认丢了,接收TCP并不会知道,而是认为他已经完成任务了。但是发送TCP由于没有收到确认,就会一直等待接收方发送确认来通知窗口的大小。双方的TCP这时就会造成死锁,所以要使用一个计时器来避免死锁的发送。 当TCP收到一个窗口大小为0的确认时,就要启动坚持计时器。当坚持计时器期限到时,发送TCP就发送一个特殊的探测报文,这个探测报文段只有一个字节数据,它有一个序号,但是它的序号永远不需要确认。探测报文段提醒对端,确认已丢失,必须重传。 坚持计时器的值设置为重传时间的数值。若没有收到从接收端来的响应,需要发送一个探测报文,并将坚持计时器的值加倍和复位,直到这个值增大到门限值(通常60秒)为止。在这以后,发送端每隔60秒发送一个探测报文,直到窗口重新打开。
时间等待定时器
主动关闭一方会进入TIME_WAIT状态,被动关闭一方要确定主动关闭一方发送的最后一次ACK回应可以收到防止有其他链接再次链接上已经断开的链接。因为链接一般存活的时间为MLS时长。(在实际socket编程中可以通过setsockopt来设置端口复用) http://blog.csdn.net/lf_2016/article/details/60468161三次握手
三次握手状态图
TCP的三次连接中,客户端是主动链接,服务器是被动连接,整个过程有三次数据报文段的传送,所以TCP建立过程又称为三次握手。 服务器进程先创建传输控制块TCB,准备接受接受客户进程的连接请求,然后服务器进程就处于LISTEN(收听)状态,等待客户端的连接请求。传输控制块TCB里面存储了每一个连接中的一些重要信息,比如:TCP连接表、到发送和接受缓存的指针,到重传队列的指针,当前的发送和接受序号。
连接的步骤
客户端的进程也是先创建传输控制块(TCB),然后向服务器发出连接请求报文段。这时首部中的同步位SYN=1,同时选择一个初始序号seq=x。TCP规定,SYN=1的报文段不能携带数据,但要消耗一个序号。这时客户进程进入SYN-SENT(同步已发送)状态。 服务器收到连接请求报文段后,如果同意连接,则向客户进程发送确认。在确认报文中,SYN=1,ACK=1,确认号是x+1,同时也为自己选择一个初始序号seq=y。这时服务器进程进入SYN-RCVD(同步收到)状态。 客户进程收到服务器的确认之后,还要再向服务器发出确认。确认报文段中,ACK=1,确认序号ack=y+1,而自己的序号是seq=x+1。TCP规定,ACK可以携带数据,但如果不携带数据的话则不消耗序号。 这时TCP连接建立,客户端进入连接状态(ESTABLISHED)。当服务器收到确认之后,也立即进入已连接(ESTABLISHED)状态。为什么要第三次握手呢???
这主要是为了防止已失效的的连接请求报文段。 假设,客 户端发出连接请求报文段,但是该连接请求报文段在某个网络节点中长时间滞留,导致客户端因为超时又发送第二个链接请求报文段 。第二个连接请求与服务器建立连接,而第一个连接请求报文段 以至于延误到连接释放以后才到达服务器。本来这个连接早已经失效了,如果只采用两次握手的话,服务器会误认为客户端又发送了一次连接请求,从而统一建立连接。所以,采用三次握手可以很好的避免这个问题。
http://blog.csdn.net/lf_2016/article/details/60479280
为什么要等2MSL
这最主要是因为两个理由:
为了保证客户端发送的最后一个ACK报文段能够到达服务器。因为这个ACK有可能丢失,从而导致处在LAST-ACK状态的服务器收不到对FIN-ACK的确认报文。服务器会超时重传这个FIN-ACK,接着客户端再重传一次确认,重新启动时间等待计时器。最后客户端和服务器都能正常的关闭。假设客户端不等待2MSL,而是在发送完ACK之后直接释放关闭,一但这个ACK丢失的话,服务器就无法正常的进入关闭连接状态。
他还可以防止已失效的报文段。客户端在发送最后一个ACK之后,再经过经过2MSL,就可以使本链接持续时间内所产生的所有报文段都从网络中消失。从保证在关闭连接后不会有还在网络中滞留的报文段去骚扰服务器。
注意:在服务器发送了FIN-ACK之后,会立即启动超时重传计时器。客户端在发送最后一个ACK之后会立即启动时间等待计时器。
查询算法
主机向本地域名服务器的查询一般都是采用递归查询,即如果主机所询问的本地域名服务器不知道被查询域名的IP地址,那么本地域名服务器就以DNS客户的身份,向其他根域名服务器继续发出查询请求报文,而不是让该主机自己进行下一步的查询。因此,递归查询返回的查询结果或是所要查询的IP地址,或是报错。 本地域名服务器想根服务器的查询通常采用迭代查询,即当根域名服务器收到本地域名服务器收到本地域名服务器发出的迭代查询请求报文时,要么给出所要查询的IP地址,要么告诉本地域名服务器“下一次应向那个域名服务器进行查询”。然后让本地域名服务器进行后续的查询。根域名服务器通常把自己知道的顶级域名服务器的IP地址告诉本地域名服务器,让本地域名服务器再向顶级域名服务器查询。顶级域名服务器在收到本地域名服务器的查询请求后,要么给出所要查询的IP地址,要么告诉本地域名服务器下一步应当向哪一个权限域名服务器进行查询。本地域名服务器就这样进行迭代查询。
0比特插入法对数据实现透明传输 如 贞起始标志位为01111110,包含连续6个1,为了避免信息中出现连续6个1,发送端连续5个1就会插入一个0. 01111110是HDLC贞的标志字段。
TraceRoot 用来检测主机到目的主机之间所经路由情况的重要工具
原理:他收到目的主机的IP后,首先给目的主机发送一个TTL=1(TTL-》IP数据报最大允许进经过的跳数)的数据报,而经过的第一个路由器收到这个数据包之后,就自动把TTL减一,当TTL减到0后,路由器就把这个包给抛弃了,并同时产生一个主机不可达的ICMP数据包给主机,主机收到这个数据包以后,再把一个TTL=2的数据报给目的主机,然后第二个路由器给主机发ICMP数据报,如此反复,tracerate就拿到了所有IP。
###一、ICMP的主要功能 1. ICMP的分类: 1. ICMP差错报文 2. ICMP询问报文 2. ICMP差错报文有5种 1. 终点不可达:当路由器或者主机不能交付报文时 2. 原点抑制:当路由器或者主机由于拥塞二丢弃数据报时,发送此报文这时原点会把发送报文的速度减缓。 3. 时间超时:收到生存时间为0的报文时发送 4. 参数问题:有数据报首部有字段值不正确时发送 5. 改变路由(重定向): 路由器把改变路由报文发送给主机,让主机知道下次应将数据发送给另外的路由器。 2. 询问报文: 1. 回送请求和应答(ping) ICMP回送请求报文时由主机或路由器向一个特定路由器发出的报文,收到此报文的主机必须给源主机或者路由器发送ICMP回送回答报文,这种报文用未测试的目的主机是否可达,以及了解有关状态。 2. 时间戳请求和回答 ICMP时间戳请求报文是请某个主机或者路由器回答当前的日期和时间,可用来进行时间同步或者测量时间。