[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