- Source port và Des port lấy từ thông tin về session tương ứng: Code:
Gán tạm thời 1 số giá trị cần thiết cho IPHeader để tính checksum: Code:
pSession->seqNumber = pSession->seqNumber + len;
Lưu ý (chỗ này lúc viết code mình bị sai, debug mất cả buổi tối): tuy các bản tin SYN và FIN không chứa dữ liệu, nó vẫn được xem là có chiều dài dữ liệu 1 byte, phải tăng số tuần tự lên 1 không chứa dữ liệu, nó vẫn được xem là có chiều dài dữ liệu 1 byte, phải tăng số tuần tự lên 1 đối với các bản tin này:
Code:
if(Flags & (TCP_FIN_FLAG|TCP_SYN_FLAG)) (pSession->seqNumber)++;
Số ACK:Code: Code:
tcpHeader->ackNumber = HTONL(pSession->ackNumber);
Nếu có cờ SYN, như đã nói trên Header TCP sẽ có trường Option chiều dài 8 byte, do đó ta phải ghi giá trị tương ứng cho trường Offset, và tăng biến len lên tương ứng: ghi giá trị tương ứng cho trường Offset, và tăng biến len lên tương ứng:
Code:
if(Flags & TCP_SYN_FLAG){
tcpHeader->Offset = (0x07<<4); len += (TCP_HEADER_LEN + 8);
Nếu không, chiều dài TCP Header là mặc định (đã định nghĩa TCP_HEADER_LEN)Code: Code: }else{ tcpHeader->Offset = (0x05<<4); len += TCP_HEADER_LEN; } Ghi giá trị các cờ Code: tcpHeader->Flags = Flags;
Giá trị trường WindowCode: Code:
tcpHeader->Window = HTONS(pSession->srcWin);//((NETSTACK_BUFFERSIZE- 20-14));
Tạm thời gán checksum = 0 (ta sẽ tính TCP checksum sau)Code: Code:
tcpHeader->Checksum = 0;
Con trỏ khẩn không sử dụng:Code: Code:
tcpHeader->UrgentPtr = 0x0000;
Trỏ đến biến con trỏ ipHeader đến vùng IP Header trên buffer:Code: Code:
ipHeader = (struct ntIPHeader*)(dataBuffer-IP_HEADER_LEN);
Gán tạm thời 1 số giá trị cần thiết cho IP Header để tính checksum:Code: Code: ipHeader->srcIPAđr = HTONL(ipGetConfig()->ip); ipHeader->desIPAđr = HTONL(pSession->desIP); ipHeader->Checksum = HTONS(len); ipHeader->TTL = 0x00; ipHeader->Protocol = IP_PROTO_TCP;
Ở đây các bạn cần tìm hiểu thêm cách tính checksum TCP, nó không chỉ tính checksum phần TCP Header và dữ liệu mà còn tính thêm 1 số trường của IP trong 1 header IP giả, do đó ta phải