[elektro] 18f87j60
Moczik Gabor
pm_levlista at progzmaster.hu
Tue Aug 11 20:57:29 CEST 2009
Tóth Péter wrote:
> Moczik Gabor írta:
>> Egyelore a http-t hagyd ki a jatekbol, koncentralj a TCP/IP stack-re.
>>
> De, hát már ez következik. Tudok szinkronizálni, fogadom a GET
> lapnyitási kérelmet és küldeném a 200 OK-val a cuccot, csak még valami
> nem kerek, lehet, hogy csak a CRC-t kell rendbe tegyem...
Hát mondom, ha a checksum még problémás, akkor még a HTTP odébb van.
Le kell tesztelni a TCP-t mindenféle plusz bonyolítás (böngésző) nélkül.
Az hogy fogadni tudsz, az csak annyit jelent, hogy a te stacked
elfogadja a TCP packet-et. Ha mondjuk nem is ellenőriznéd a checksum-ot,
ez akkor is működik, mert igen jó eséllyel hibátlan a csomag. Amit
viszont te küldesz, abban kell legyen egy jó ellenőrzőösszeg, mert
különben a PC oldalon már a TCP/IP stack eldobja a csomagot, az
alkalmazásig el sem jut.
Ezért célszerű kipróbálni telnet-tel, ott látod, hogy tényleg meg sem
érkezik a csomag, és még a TCP bugos, vagy semmi baj nincs, csak a
böngészőnek nem tetszik valami. Egyből azt is látod, hogy mit küld a
cucc, látszik ha hiányzik egy kettőspont vagy soremelés...
-------
Egyébként ez nem CRC (cyclic redundancy code), hanem egy sima
ellenőrzőösszeg (checksum).
"The checksum field is the 16 bit one's complement of the one's
complement sum of all 16-bit words in the header and text. If a segment
contains an odd number of header and text octets to be checksummed, the
last octet is padded on the right with zeros to form a 16-bit word for
checksum purposes. The pad is not transmitted as part of the segment.
While computing the checksum, the checksum field itself is replaced with
zeros."
Magyarul:
A header valamint az adatot 16-bites szavakra bontva, az összes szó
értékét össze kell adni, az eredmény 1-es komplemensét venni, és ez a
checksum. Ha páratlan számú byte van, akkor az utolsó byte-ot a jobb
oldalon ki kell egészíteni egy nulla byte-tal a számítás idejére
(továbbítani nem kell). A TCP checksum mezőt nullaként kell értelmezni a
számítás idejére.
A header nem csak a TCP header, hanem az IP-ből néhány mezőt hozzá kell
venni (pseudo header).
Itt egy C függvény:
http://www.netfor2.com/tcpsum.htm
A sequence number (SEQ mező) egyébként jól működik?
Annak idején összevadásztam többféle TCP/IP stacket a netről, majd
előkeresem valahol. Ami akkor szemet szúrt, hogy a microchip féle
implementáció elég csúnya kód, vannak szebbek is. De ez jópár éve volt,
nem tudom azóta finomították-e...
Hirtelen ezt találtam:
http://www.sics.se/~adam/uip/index.php/Main_Page
More information about the Elektro
mailing list