def validatePacket(packet): if not IP.validateChecksumZero(packet[0:20]): return False, "IP" else: print "IP VALIDATION: SUCCESS" ip_header = IP.unpackHeader(packet[0:20]) #Get Length of IP header ip_ver = ip_header[0] >> 4 ip_header_length = ip_header[0] & 0xF ip_length = ip_header_length * 4 tcp_packet = packet[ip_length:] pseudo = pack('!4s4sBBH', ip_header[8], ip_header[9], 0, socket.IPPROTO_TCP, len(tcp_packet)) if not TCP.validateChecksumZero(pseudo + tcp_packet): return False, "TCP" else: print "TCP VALIDATION: SUCCESS" return True, ""
sender_socket.sendto(syn_packet, (DESTINATION_IP, DESTINATION_PORT)) #Time when the packet was sent packet_sent_time = time.time() #WAIT FOR A SYN_ACK while True: try: packet = receiver_socket.recvfrom(65565) packet = packet[0] #print packet validation_status, faulty_packet = validatePacket(packet) if validation_status: #IP header bytes ip_header = IP.unpackHeader(packet[0:20]) if socket.inet_ntoa(ip_header[8]) == DESTINATION_IP and socket.inet_ntoa(ip_header[9]) == SOURCE_IP: #Get Length of IP header ip_ver = ip_header[0] >> 4 ip_header_length = ip_header[0] & 0xF ip_length = ip_header_length * 4 tcp_header = TCP.unpackHeader(packet[ip_length: ip_length + 20]) ack = (tcp_header[5] & 0x10) >> 4 syn = (tcp_header[5] & 0x02) >> 1 if ack == 1 and syn == 1 and tcp_header[0] == DESTINATION_PORT and tcp_header[1] == SOURCE_PORT and tcp_header[3] == (ACK_NUM + 1): #SYN-ACK received SEQ_NUM = tcp_header[2] + 1 SEQ_START = tcp_header[2] ACK_NUM = tcp_header[3]