Placeholder Image

字幕表 動画を再生する

  • One of the most common error detection techniques used in data communication

  • And storage is the CRC the cyclic redundancy check and it's similar to a checksum and in fact in some cases

  • You'll hear a call to checksum but it's but it's not a sum like this you're not adding up all of the the different characters

  • And coming up with some sort of check sequence here instead

  • What you're doing is instead of representing it as a bunch of individual numbers and adding them up

  • you're representing your entire message essentially as one big long binary number and

  • Then what we can do is we can do math on on that one big number to try to come up with some sort of

  • Check sequence. So just as an example, and this isn't exactly how CRC works

  • We'll get to that in a minute here

  • But just to kind of get you a sense of where we're headed with this

  • I've got two messages here

  • And the only difference is just these two letters have change to the Oh change to an N and the R change to an S

  • so essentially we subtracted one from the O we added one to the s and this is an interesting change because this is something that

  • The checksum wouldn't catch because if we're subtracting

  • One number and then adding another that doesn't change our overall sum so we wouldn't catch that with a checksum

  • But if we represent our entire message is one big long binary number. It does change that number

  • And just to give you a sense like this binary number can also be represented as a decimal equivalent

  • And so this is actually what that what that is for these two messages and so you can see this is just this big long

  • Number this is the decimal equivalent of this big long binary string

  • And you can see because we've got two changes here the number is very different

  • And in fact, if we do some just some basic math to it. You'll see some other differences

  • so for example if we divide both of these by

  • 251 well, then we get some big long answer here

  • But then there's a remainder as well of 50 if we divide this other number which represents this other message by the same thing 251

  • Then we get a different answer, but we also get a different remainder

  • And so you can imagine what we might do is send our message

  • Along with this remainder and then on the other end when we receive the message if we receive the message and it has some corruption

  • Like this when we do that same division and compute the remainder

  • We can see that the remainder is different and we can use that to detect that there was an error in receiving our message. So

  • This simple division like this is actually a bit simpler than the way CRC really works

  • But I think it's going to be a useful analogy to walk through an example of before we actually get into how CRC really works

  • So let's take a simpler example here instead of hello world. We'll just use the message. Hi exclamation

  • So it's just three bytes that way are our numbers that we're dealing with. They're a little bit smaller

  • That's what we want to do is we want to transmit our message

  • Hi, and then we also want to transmit some sort of check sequence

  • So what I'm going to do is actually add a few extra bytes actually two extra bytes here

  • so sixteen bits of all zeros

  • And what we're going to do is we're going to fill these extra bytes in here with our check sequence

  • So our overall thing that we're sending is going to be this this big long number

  • But we're gonna change some of these zeros to actually get the full message

  • But if we leave these as zeros for now

  • We can convert this entire long thing into a decimal number and we end up with this this number here

  • so again

  • We're treating our entire message as just a number

  • and

  • so what we can do is we can then divide this this number divide our message by some other number and so I'm gonna I'm

  • going to divide it by six five five to one and

  • It's actually sort of

  • important what number you choose to divide by and it might be interesting to think about why that is but but we'll get back to

  • That in a minute here

  • but if we divide this message as

  • Represented by this number by six five five to one and look at the remainder when we do that division

  • The remainder we get is two six seven six nine

  • and

  • So it's this remainder that we're going to use to sort of form the check sequence that we're going to add on to our message

  • But we don't want to just stick that to six seven six nine in there

  • What we want to do is actually something a little bit more clever

  • which is take the number we divided by six five five to one and subtract that and

  • we end up with this difference here and if what we do is we use that difference then and

  • add that to our original message we get this new number and

  • You might be wondering well, why are we doing all this?

  • well

  • The reason we would do this is because this new number that we get is now going to be a multiple of six five five

  • To one and it's going to be a multiple of six five five to one because we took this other number and we figured out

  • what the remainder was and we tacked on the extra bit to get from that remainder to the next multiple of six five five to

  • One and so basically this this number is just the next multiple of six five five 21 after our message

  • and in order to get there we needed to add on this extra thirty eight thousand 752

  • but what that means is we can take this three eight seven five two and

  • Encode that in these last two bites here

  • So remember we had all zeros here

  • If we encode that three eight seven five two in there

  • then that gives us our entire message now equals this thing which is now a multiple of six five five two one and

  • so now what we get is we get this entire message that we can send that has the message we want hi as

  • Well as some extra bit here

  • But the entire thing if we think of it as just a single number when we divide that number by six five five to one

  • the remainder will be zero and that's

  • what we can do to

  • Check or to verify that we receive the message correctly because of any of these bits changes

  • Then it's very likely that it will no longer

  • That the overall thing will no longer be divisible by six five five to one and that's whether one of the bits in our message

  • Changes or one of the bits in our little check sequence over here changes if any of those bits changes

  • Then there's a pretty good chance that it'll no longer be divisible by six five five to one

  • And so if we receive a message

  • That's not divisible by six five five to one. Then we can come to the conclusion that something might have been corrupted

  • So for example, if our message changes from hi to ho

  • Because these two bits here changed and corrupted our message into something different than what we wanted to send

  • Then we'd be able to detect that because if we then take this new big long binary number and we take the value that it

  • Represents and divide it by six five five to one again. The remainder is not zero. It's something else

  • It's just twenty three zero four zero

  • and because that remainder is not zero because this message is not divisible by the

  • magic, six five five to one number

  • Then we can conclude that the message got corrupted and that the message ho is not the message that we intended to send

  • Now you might be wondering

  • Why did we choose 6 5 5 to 1 2 divided by like why that specific number and doesn't it doesn't even matter

  • Can you just divide by anything?

  • Well it definitely matters

  • It matters a lot actually and the thing that you choose to divide by here

  • Has some bearing on the types of errors you're able to detect or at least the specific error patterns that you're able to detect

  • So to sort of understand why that's the case

  • Let's look at this same example here, but break it down a little bit

  • You can imagine we have our transmitted message here, which is high along with the correct sort of division

  • you check some thing that we're using here and we get this number and

  • Then we have the received message down here at the bottom, which has the two bits flipped and that's this other number

  • But one way to think of this relationship here is that the received message is equal to the transmitted message plus whatever error occurred

  • So in this case, these two bits got flipped

  • so what happens is this these two bits flipped equals this other number and so you can think of the the received message as being

  • The transmitted message plus that error

  • And this is kind of a helpful way to think of it because we know that our transmitted message is divisible by

  • Whatever number we're dividing by so 4 divided by 6 5 5 2 1 in this case

  • we know that our transmitted message is divisible by that and

  • So for the receive message to be divisible by that in or in order to receive it correctly

  • The transmitted message plus the error have to be divisible

  • well

  • We know the transmitted message is already divisible by that so we can almost sort of ignore that and so what this is telling us

  • is that as long as our error is not divisible by in this case 6 5 5 to 1

  • Then we'll detect that there was an error

  • So in this case our error is this is this number here or you know this binary number here if you wanna think of it

  • that way

  • That's not divisible by 6 5 5 to 1. So we're able to detect that error

  • But if instead of 6 5 5 to 1 we had some other number, let's imagine. We were dividing by 256

  • Well, we're dividing by 256

  • This would be a multiple of 256 anything where the last 8 bits are zeros is a multiple of 256

  • So there's lots of multiples of 256

  • So almost any error that we would have in in our entire message would not be detected if we were dividing by 256

  • So that would be a terrible choice of something to divide by

  • Where as 6 5 5 2 1 is maybe a much better choice? It happens to be a prime number and

  • It's actually the largest prime number that fits in 16 bits

  • So that makes it a better choice, but ideally what we'd want to be able to do is think you know

  • Mathematically and very rigorously about what are the multiples of of the number we're dividing by and what are those bit patterns look like?

  • and that's actually very hard to do because you can imagine if

  • We were intending to send the message ho H. Oh and this is what our message look like

  • Our checksum here is a little bit different right because it's a different message

  • And so the overall message numbers going to be different

  • But if what happened was our message ho got corrupted the other way into high

  • So there's one's turned to zeros. Then the error that we I guess essentially would add

  • Kind of in this in this equation here to get to our new message

  • Would be a very different sort of bit pattern than the bit pattern

  • that we had here even though it's the same two bits that are flipping and

  • so this ends up being actually pretty hard to reason about so if we're trying to think of like

  • What is the best thing to divide by here in order to catch the sorts of errors that we might expect so maybe?

  • Maybe we expect something like this. We know that our transmission medium works a certain way

  • There's certain types of errors that are that are likely to occur and one of those types of errors that's likely to occur

  • He has two bits in a row get flipped

  • Well here we have an example of that two bits in a row get flipped and our error here is just two bits

  • And so then we can think about okay, what are all of the possible sort of two bit?

  • Values that are in here and then we can think about what number might we choose

  • where none of those two bit patterns is a multiple of that number and if we can actually find a number that matches that then

  • You think well, maybe we maybe we can actually guarantee that any two-bit error

  • We were able to catch like that or any two bits in a row or whatever type of error we might expect

  • But here we have two bits in a row that get flipped, but our error has a whole bunch of bits that are flipped

  • And so the problem we're having here is actually related to place value, right?

  • Because if we add one plus one we get zero and then carry a one over here

  • and then add one plus one we get zero again and carry a 1 over here and

  • We just end up with this sort of rippling effect that leads to this this whole mess here then even though only two bits actually

  • Got flipped between our transmitted message and our received message. It's not necessarily easy to just look at that error component and see a

  • relationship between

  • The error and and the actual bits that got flipped, you know

  • Like you might think there is if you just look at this one example here

  • And so all of that actually makes it much more complex

  • In fact, very complex to think about what number we would divide by to look for certain bit patterns in our error

  • And so because of this CRC does something different and actually quite clever

  • So CRC doesn't represent

  • The message as a number like this instead, it still represents it as a mathematical expression, but it represents it as a polynomial

  • So check this out. Let me show you an example of how that works. So

  • Here's the letter H. And here's how we'd rent that in binary

  • So if we're actually transmitting the letter H over a network

  • These are the actual bits that we would send and as we've been seeing we can think of that as an in this case 72

  • And the reason that we think of that as 72 is that each of these bits has a place value, right?

  • So if I just sort of expand this out?

  • This is the same the same number and what we're doing when we convert that to 72 is we're just saying each of these

  • Each of these bits has a place value

  • so this bit all the way here on the right has a place value of 1 2 to the 0 is 1 right this

  • Here has a place value of 2 4 8 16 32 64 and 128, right?

  • those are just powers of 2 and what we do is we just multiply each of those powers of 2 by the

  • Bit value whether it's a 0 or 1

  • So in the case of 0 we simply just ignore that term in the case of 1 then we have a 2 to the 6

  • plus

  • 2 to the third and to the 6 to 60 4 to the third is 8 and if we add those together we get 72

  • So this is this is just how we get 72

  • This is how binary numbers work

  • You know one property of this is if we add another 8 to this here

  • We wouldn't have two x to the third because two eights here makes it 16

  • right

  • So you'd carry that 16 over into the next place and t2 have 1 2 to the fourth instead of 2 to the Third's

  • Right, and because you have that carrying between places here

  • That's basically how you can get lots of bits changing here in the mathematical difference

  • If you subtract even though only two bits actually changed, you know that the carrying effect

  • So a trick that crc uses to avoid carrying is basically do the same thing

  • But replace all the powers of two with powers of X

  • Now each term is truly independent. If we add another one to this term here. It doesn't carry over

  • We just get 2 X to the 3rd

  • it doesn't touch the X to the fourth term and just like before we can simplify by getting rid of all the zero terms and

  • end up with just X to the sixth plus X to the third and

  • So this is just a different way of representing this same binary string

  • It certainly looks a little bit weirder than just a number but it's you know, it's another expression

  • It's a way to represent the same the same binary message here the same binary string

  • you might be wondering you know, what the X is or what it represents and

  • It's sort of weird. It doesn't really represent anything

  • I mean, I guess I mean you could plug two in here and you get 72 you get the same thing

  • But the idea is that doesn't have to be - or really does have to be anything

  • So X doesn't really represent anything. It's just part of this trick that we're doing that just gives a different way to represent our message

  • But the important part is that even though X doesn't really represent anything real

  • this expression we end up with still in algebraic expression just like 72 is

  • So we can still do math to it

  • and in fact

  • We can still divide it by stuff and get remainders and you know everything else we were doing before

  • It just looks a little bit weirder and so we can do the same thing with a bigger message like our message

  • hi, so we have our message hi, and then we have

  • 1600 ver here and this is where our checks are actually eventually this is where a CRC check is going to go

  • But we can convert this to a polynomial like this the same way and this is what we get

  • And so what you see is if you sort of count over here from you know, zero one, two, three

  • This is the sixteenth bit. And that's a one and then you go 17 18 19 20 21

  • So that's why we have the X to the 21 term

  • 22 23 24 we have our X to the 24 term and so on. So each of these ones turns into a

  • Term and our polynomial in the appropriate position

  • And so maybe it was a little bit weird at the beginning of the video to think of this message

  • This entire message is just one big long number and maybe it's even weird or still to think of this message as a polynomial

  • But it's a perfectly reasonable way to represent the message and because it's a perfectly good

  • Algebraic expression we can do math to it so we can even divide it by something. So for example

  • It looks a little Messier here. But here's our here's our polynomial right here under our division. That's the same thing

  • That's our message and we can divide it by you know

  • some other numbers so or some other polynomial actually in this case and

  • Again, it it does matter what you divide by and we'll get to how you might choose that

  • And what that actually means but it is going to impact what types of errors you can detect but for now

  • We'll just use this one that I've got here

  • and if we divide our message by that polynomial you get some answer and it's some big long messy polynomial and

  • then you can multiply these two together and you get

  • some other thing and if you subtract that you get a remainder and so this

  • Remainder down here is is in fact the remainder when you divide our message by this polynomial

  • And that's the exact same thing. We were doing at the beginning of the video, right?

  • We have our message here represented as number. We divide our message by some magic number and we get a remainder here same thing

  • We've got our message

  • Represented as a polynomial we divided by some magical polynomial and we get a remainder

  • and then we can use this remainder then to kind of fill in the the

  • Remainder as it were of our message here so that our entire message then is divisible by our magical polynomial

  • But unfortunately, we've got a bit of a problem here

  • I don't know if you've noticed here

  • but if we want to take this polynomial and

  • Use that to determine the little remainder bit here to fill in the check sequence in our message

  • We've got to figure out how to convert this polynomial back to a binary representation

  • And say so, okay. Well you just look at each position here. So in the 15th bit position, that's here. We put a six

  • What wait a minute?

  • There's no such thing as six. This is a binary number

  • So we've got a bit of a problem here. Yeah, you know, how do we what do we do with this six?

  • You know, we've got like negative numbers in here

  • Well, you know the fifth bit position is I want a negative one and we've got two over here

  • So it looks like we've got a problem here, but fortunately there's another mathematical trick that we can use that will help us out

  • And so the mathematical trick we can use is this thing called finite fields?

  • And so we do a quick sidetrack into what what finite fields are and so to understand what that is

  • Let's talk about algebra here for a minute algebra is basically the set of rules that you can use to manipulate symbols

  • So for example if we want to solve this for X

  • We can apply some rules we can add five to both sides and we can sort of simplify this and we get x over two

  • equals twelve

  • maybe we want to multiply both sides by two and that gives us x equals 24 and

  • So even if we're just solving for x, you know, anytime we're doing any algebra. We're just applying a series of rules

  • And so this rule here where you're adding the same thing to both sides. It's called the additive property of equality

  • And there's this rule here. We can multiply both sides by the same thing. That's the multiplicative property of equality

  • And so there's all these different rules that algebra has and by applying the rules you can manipulate

  • Expressions in different ways to solve problems and so algebra is just a bunch of rules that all work together and produce consistent results

  • But one thing that you'll notice that maybe you never even really thought about is that whenever you're doing algebra you're using numbers

  • And the numbers that you use when you're you when you're doing algebra make up what's called a field

  • and so if you've ever done

  • You know any kind of algebra like this before you've probably done it with the field of real numbers, you know

  • These are certainly all real numbers

  • And so as long as all the numbers that you're using are real numbers then you know

  • We can apply all the rules of algebra and whatever

  • Manipulations we get when we use those rules are valid and we can use those to solve problems but algebra works for other fields

  • Too so, you know, maybe you've used complex numbers and complex numbers are just a different field

  • but all the rules of algebra as you know work just as well, but

  • we're interested in a finite field and

  • As the name would imply instead of having an infinite number of numbers like the real numbers or the complex numbers a finite field

  • Uses a finite number of numbers, but still all the rules of algebra work just the same

  • So, how does that work? So what is the field?

  • so a field is basically just a set of numbers and then a definition of how you add those numbers together and how you multiply

  • those numbers and that's basically it but

  • Your field has to obey certain rules in order to be a valid field in order for algebra to still work if you use that

  • Field and so there's certain field axioms

  • So for example, there's this axiom of socit if ax t so, however, you define your addition and multiplication

  • It has to be associative. It also needs to be commutative

  • So a plus B has to equal B plus a and same with multiplication you have to have identities

  • So there has to be an additive identity there has to be some number so you've got this set of numbers that that are in

  • Your field you've got one of those numbers has to be an additive identity so that if you have a plus that number

  • usually zero you get a

  • same thing for multiplying essentially you need a 0 and a 1

  • You also need to have an additive inverse

  • So something where if you add a number to its inverse you get zero, you need a multiplicative inverse

  • which is some number 1 over a for example, if you multiply a number by its inverse you get 1

  • And finally your rules of addition and multiplication have to have to be distributable

  • They have to follow this rule of a times B plus C equals a times B plus a times C

  • and

  • So within these rules you can come up with any set of numbers in any

  • definition that you want to of multiplication and addition and as long as it meets all these rules as long as you definition of

  • What numbers are and what?

  • Multiplication means and what addition means as long as those rules meet these axioms then your field your set of numbers and your rules

  • Will work with all of the rest of algebra, which is pretty cool

  • So in our case, what we want to do is we want to be able to do algebra like this

  • where instead of getting you know 6 and negative 1 & 3

  • All we get is just ones and zeroes so that we can then nicely convert that back into a binary string here

  • So what we really want is a field

  • An algebraic field that we can do algebra with that only has a material and 1 in it

  • So can we do that? Well, it turns out yes we can and this is how we would define that field. So

  • Our field only has two numbers in it 0 & 1 and then we can define addition like this

  • It's easy enough to define addition because there's only two numbers and so we could just list out every possible addition problem

  • And there's you know, there are some weird things in here

  • So 0 plus 0 equals 0 you'd expect that 0 plus 1 1 plus 0 equals 1

  • You know you expect that but then 1 plus 1 we're defining that as equal to 0

  • Ok

  • It turns out by doing that then we actually meet all of our our axioms

  • With respect to how we're defining addition same thing with multiplication works pretty much the way you'd expect

  • Anything times 0 is going to be equal to 0 1 times 1 equals 1 and just by defining addition to multiplication like this

  • We're meeting all of the field axioms

  • And so this is a valid field even though there are a couple sort of weird counterintuitive things that you might not expect

  • So for example, we need to have this additive inverse. So you have to say a plus negative a always equals zero, so

  • Normally you'd think of like ok, five plus negative five equals zero

  • That's that's sort of the way that that would work with the real numbers but in our world

  • The additive inverse of a number is the number itself. So the add of an inverse of zero is zero

  • so zero plus zero equals zero that works and the additive inverse of 1 is also 1 so one plus one equals zero because we've

  • Defined this that way then we can kind of check off that axiom there

  • And so you may want to you know, pause the video and convince yourself that our definition meets all of these axioms

  • But but it does this definition here does meet all those axioms and there's just a couple weird things

  • but we've defined all the weird thing in just the right way so that they meet the axioms and so again,

  • You might you may want to pause or sort of convince yourself that that's the case

  • But because this is a valid field that means we can use these numbers just zero and one only those two numbers

  • with this definition of addition and this definition of

  • Subtraction multiplication division and all of the rules of algebra will just work in a consistent way, you know

  • Even though there are some unintuitive definitions in here. So if we go back to this, you know gnarly

  • Polynomial division that we've got going on here if we use the finite field when we do this division

  • We won't end up with all these weird coefficients these you know, the six and those negatives and the two and so forth

  • We'll end up with just ones and zeroes as our coefficients

  • So let's actually work through this division problem using our finite field to see exactly how how this all plays out

  • Ok. So again, this is the message. We're gonna send hi

  • Exclamation and we only have 16 bits here at the end to fill in our CRC

  • And because we're leaving 16 bits the thing we want to divide by this is called generator polynomial

  • I'm going to use a 16th degree

  • Polynomial so that we're able to make use of at least all of those all 16 of those bits. So the message itself

  • Shifted over is this polynomial here, and I'm going to divide it by this same generator polynomial here

  • And again, I'll talk about how you go about choosing a generator, you know

  • A good generator polynomial in a little bit and so I set this up as this long division problem

  • And in fact, we are going to do long division. That's very similar to the long division

  • You might remember from from grade school. And so the way we start is we basically look for

  • how many times X to the 16th goes into X to the 38 and

  • That happens to be X to the 22nd times right? Because X to the 16 times X to the 22nd is X to the 38th

  • in fact

  • we can do that multiplication now now that we've come up with a term here in our in our quotient we can multiply X to

  • The 22nd times our polynomial here and so X to the 22nd times X to the 16th is X to the 38th plus

  • X to the 22nd times X to the 12th is X to the

  • 34th and then X to the 22nd times an X to the fifth is X to the

  • 27th and then X to the 22nd times 1 is just X to the 22nd

  • So I just multiplied X to the 22nd times our divisor here this Janner your polynomial to get this right here

  • And so now just like normal long division I'm gonna subtract

  • It so we have X to the 16th - nothing that's going to be X to the 16th

  • X to the 21st - nothing. Is it going to be X to the 21st?

  • and here we have nothing - X to the

  • 22nd and so you might think well that's going to be negative x to the 22nd because we're subtracting this right this

  • Subtraction we're doing here, but that's not true

  • Right because we're using our finite field and in our finite field

  • remember that 0 - 1 equals 1 because we don't have a negative 1 we only have a

  • 0 and a 1 so this is actually going to be a positive

  • X to the 22nd or the coefficients going to be 1 I guess because our coefficients can only be 0 or 1

  • That's the whole point of using this finite field

  • and of course you might wonder well if we only have 0 & 1 well

  • How come we can have 22 here and this isn't 22, I guess in terms of being a number that we're operating on

  • This is really just 22 X's multiplied together

  • And so we can do that because we could just write out 22 X's all multiplied together

  • But in terms of the coefficients that we have the actual numbers in our expressions

  • We're only using 0 & 1 & we're using our special addition and multiplication rules

  • Okay, so moving along X to the 24th - nothing is going to be X to the 24th X to the 27th - X to

  • the 27th, you know again, that's that's the coefficient 1 minus 1 and so one minus one is is 0

  • We're not not doing anything weird there

  • Right 1 minus 1 is 0 so nothing nothing special. Nothing crazy there that just cancels out

  • So X to the 29th - nothing is X to the 29th

  • X so xxx - nothing to the 30th and then this term here we have 0 minus 1 times X to the 34th again

  • That's going to be plus X to the 34th because again, even though we're subtracting

  • We don't have a negative 1 in our finite field that we're using. Okay moving along X. So 35

  • Minus nothing is going to be X to the 35th and the next to the 38th minus X to the 38th

  • That's 0 so that cancels out

  • So that's the first step of our long division here, right?

  • we figured out that our polynomial here divides into our message X to the 22 times and has a remainder of

  • This thing down here, but we're not done yet

  • Right because X to the 16th, we can divide that into X to the 35th as well and that go x2 the nineteenth times

  • So we can keep going now and we're gonna basically just repeat this process and go through this entire polynomial here

  • So now we're going to multiply X to the 19th times our polynomial write that down here subtract and keep moving

  • So again, we can say that our message

  • Divided by this generator polynomial equals x to the 22nd plus X to the 19th, and it has this remainder

  • But we're still not done yet

  • Right because X to the 16th goes into X to the 34th as well and that goes X to the 18th times

  • So we'll add an X to the 18th up here

  • And now we'll multiply X to the 18th by our generator polynomial and subtract that off

  • And now this is our new remainder

  • But we're still not done right X to the 16th goes into X to the 31st X to the 15th times

  • So we'll put an X to the 15th up here add that into our quotient and multiply that

  • And we'll go ahead and subtract. All right, still not done

  • Next to the 16 goes index to the 29th now X to the 13 times

  • And now multiply X to the 13th times our generator polynomial

  • and then subtract

  • And now this is our remainder

  • The reason I'm doing this by hand

  • And I would encourage you if you really want to understand this try doing a problem like this by hand

  • Is that by doing it by hand? We start to see some patterns emerging

  • So one pattern is that we you know continue to subtract essentially this the same polynomial

  • So we're subtracting something that's very similar to this polynomial but shifted and then kind of each time through it's it's shifting over

  • but if you look at sort of the I don't know that the spacing I guess here you can kind of think of that as

  • the the terms

  • It's shifting each time we subtract and then the other thing is that the way the subtraction works is

  • It's almost kind of like an X or going on right?

  • Which is that when we do subtraction here?

  • If one term or the other is there then we see the term in the result of our subtraction

  • But if both terms are there, then we don't see the result or you know

  • Obviously if neither term is there we don't see the result. And so that's actually very similar to an XOR operation

  • so if we look at our subtraction, you can almost see I mean this is essentially I mean

  • Well, not essentially this is the truth table for an or gate

  • So it's kind of interesting that there are xor operations happening in here and it's kind of interesting that we see

  • This kind of shifting

  • So I'll just mention that I'm noticing

  • some of those patterns emerge as we're doing this division because actually both of those observations are going to be very important when we

  • Want to try to do all of this Ian's Hardware because obviously shifting and XOR. Those are things we can do in our dwyer

  • So well, we'll get to that though

  • But anyway, we're not quite done yet

  • In fact, I think we're about halfway through so I'll go ahead and finish up the rest of this division

  • And

  • So now finally X to the 16 does not go into X to the 13. So this is our remainder

  • and so because we use the finite field when we did this whole

  • Division process what you'll see is that all of our coefficients are either 0 or 1, right?

  • We don't have any of those sixes or twos or negative numbers anything like that in here. It's all just zeros or ones

  • So we could actually convert this remainder now to a binary number but also because we're using a finite field the algebra is consistent

  • So one way you could check that is you could actually multiply the generator polynomial here

  • Times the quotient that we got when we divided two this sort of answer that we got up here if we multiply those two together

  • and then add the remainder you should actually wind up with our message because again,

  • The finite field even though it's kind of weird and we had to redefine some of the addition and multiplication

  • A little bit algebra still works and that's the whole that's the whole reason to use it

  • So anyway, we we get a remainder down here and we can convert this remainder now to a binary number

  • So this is the sort of X to the zero place here

  • It's just the 1 so that's going to be a 1 and we're just looking at coefficients

  • So now the x place the coefficient is a 0 there's no X term it's just an x squared

  • So that's a 0 the x squared term. Is there X cubed term is there you know each of these terms

  • Is there X to the 9th term not there these terms are not there. So those coefficients are 0 X to the 12th

  • Term, is there X to the 13th term is there and then we can fill in the rest

  • 14 15 16 and so now we have this 16 bit remainder

  • And in fact, this is precisely the remainder that we can now include in our message here as the crc

  • In fact, this is a crc. We've computed a crc using this generator

  • So to see how to include that if we start with our message here which you know

  • We left 16 bits over here of zeros to leave space for the CRC

  • We can represent that message as this as this polynomial and we can call that M of X

  • so so M is our message and then when we divide that by this generator polynomial

  • That's what we just did and we end up with this remainder here at the bottom

  • And so what we can do is we can actually subtract that remainder from the message to get the transmitted message

  • Now notice I said that we're subtracting

  • The remainder from the message that that might seem a little bit strange because it looks like what we did is added it here

  • right because we've got our message which is this part here and you know, this message is

  • represented right here doesn't change and then this part over here is

  • The remainder right this X to the 13 X to the 12 the X to the 8 and so on down here - x squared

  • Plus 1 that's the remainder

  • And so it looks like what we're doing is we're just adding that remainder on to our message

  • but technically what we're doing is we're subtracting the remainder from the message and now it looks the same because again,

  • We're using this finite field where it turns out that addition and subtraction look like identical operations, which is admittedly a little bit weird

  • But remember, you know, as long as we're following these field axioms

  • All of our algebra is going to work

  • And so that's why I say what we're doing here is we're subtracting the remainder from our message to get this transmitted message

  • And the reason to do that to say that we're taking our message

  • Divided by our generator taking that remainder and subtracting it from the message

  • Is that so that the overall transmitted message is then divisible by the generator, right?

  • Because you know just imagine we have you know

  • instead of this polynomial if we have a number 1 2 3 4 if we divide that by 10

  • We're gonna get 1 2 3 with a remainder of 4

  • All right

  • So we have this remainder of 4 if we take 1 2 3 4 and we subtract 4, we're gonna get 1 2 3 0

  • Right, so by subtracting the remainder we get something that is now divisible by 10

  • Well, same thing here our message here that you know

  • You think of that like the 1 2 3 4 if we subtract the remainder from the message?

  • Then what we end up with this 1 2 3 0 now is divisible by 10 same thing

  • Our transmitted message is now divisible by our generator polynomial

  • And that's very handy because then we can send that transmitted to our receiver. Of course, we can encode the transmitted message

  • In binary and you know the first three bytes are going to look the same

  • So we actually you know, we have our message retained in there

  • But then these last two bytes that started out as all zeros now, we're filling in the the CRC

  • and so now if we transmit this over to our receiver and the receiver receives that

  • if the receiver divides that transmitted message by the same generator polynomial then it's going to get a

  • Remainder of zero and that's how it validates that it received the message correctly

  • But of course the receiver might not receive the transmitted message, you know T exactly correctly right? There might be a transmission error

  • So we might have a couple bits that get flipped like this

  • so in this case what's received is actually

  • This this polynomial that has a couple terms inserted this X to the 26 and X 150

  • Bits got turned on and so those terms get inserted into the polynomial

  • So now when the receiver divides this polynomial that was received by the generator polynomial

  • And performing this same check. The remainder is not going to be zero and so it'll it'll detect this error

  • It's another way to think about this is we've got our transmitted message t and then when it's transmitted there's an error

  • That is sort of added to it so we can have this other function

  • We'll call a of X which is the error

  • so in this case

  • It's these two bits the 26 bit and the twenty-fifth bit that that got flipped on

  • And so really what the receiver is doing is the receiver doesn't know the transmitted message

  • All it knows is the transmitted message plus whatever error was introduced

  • So the receiver is going to take the transmitted message plus error divide that by this

  • Generator polynomial and then check if that's equal to zero

  • And if it's not then it's going to detect an error

  • So just to look at another example real quick

  • Here's an example where again the message for transmitting is still high

  • But well received as the message ha in this case instead of two zero bits flipping two ones

  • We have a bit that's supposed to be a one that flips to a zero

  • and

  • So the polynomial that we receive is actually missing a term

  • Right the the X to the 27th term that we should have has gone missing because that bit flipped to a zero

  • so in that case

  • What is if we if we think about in these terms like what is that error look like well

  • It turns out that error just looks like X to the 27th

  • which is very convenient because it represents a single bit flipping in the 20 the position which is which is what happened and this

  • math still works the same way our transmitted message plus our error which is which is what the receiver receives if we

  • Divide that by our generator polynomial we can check to see if the remainder is zero

  • And in this case again, it's going to turn out that it's not zero, so we'll detect this error

  • And so even though the the bit flipped from a one to a zero

  • We don't have a problem with

  • Any sort of place value here because we're using polynomials

  • And we can still represent this error polynomial as being added because we're using the finite fields

  • And so those those mathematical tricks give us this nice ability to represent this error polynomial as just a collection of the bits that flipped

  • Nothing more nothing less and it doesn't matter whether they were flipped from a zero to one or a one to a zero

  • Okay. So at this point, you're probably wondering where does this generator polynomial come from?

  • You know, I just kind of threw this out here as this thing that we're dividing by without a whole lot of explanation

  • You know, but why divided by this particular polynomial, you know, where does this come from?

  • Well, it depends what errors we're trying to detect, you know, so the receiver is doing this check here, right?

  • It's taking that whatever it receives the transmitted message plus whatever errors course doesn't know the difference

  • It's just receiving something it's taking what it receives and it's dividing it by that generator polynomial

  • If we get a remainder other than zero, then we know that there's an error. That's how we detect errors now

  • We also know that the transmitted message without errors divided by the generator polynomial does divide in evenly

  • So really the question, you know

  • As far as whether this generator polynomials going to detect errors or not is whether the errors are evenly divisible by the generator polynomial

  • So if we know what this what these errors might be the you know, that is you know

  • We know what errors we we want to try to avoid then we can try to be clever and come up with a generator

  • polynomial that doesn't divide into any of those likely errors that we suspect we're gonna get

  • Let me show you an example of how we can sort of reason about what our generator

  • Polynomial might need to be in order to detect certain types of errors

  • So for the simplest case, let's say we're just trying to detect single bit errors

  • What type of generator polynomial might be able to do that? Well, let's think about what that error looks like

  • So we kind of generalize here

  • So the error in this case that we're trying to detect is X to the I where I could be any value

  • So for example in this case where our message was corrupted

  • We had a single bit error like our error was X to the 27th, right?

  • because it was the 27th bit position from the right that

  • That had the error

  • Well, if we want to detect any one bit error, then it's you know X to the I or I could be anything

  • so in order to detect this we need to come up with a polynomial that is not a multiple of X to the I

  • that wouldn't divide index to the I

  • Well, that's easy, you know any any generator polynomial with at least two terms won't divide into X to the I so

  • You know X plus one is kind of the simplest example X plus one doesn't matter

  • What I is X plus ones not going to divide into it

  • So if we use this as our generator polynomial we're guaranteed to detect any single bit errors

  • Now how about detecting two bit errors, this is a little bit more complicated

  • But we're essentially thinking about it the same way

  • We're gonna we're gonna think about what is the error that we're trying to detect in this case

  • It's well

  • It's two bits X to the I plus X to the J where hi and J could be anything

  • And this is you know an example here we see

  • Where we had two bits to change our error was X to the 26th plus X to the 25th

  • So that fits this pattern here, but it could be any two bits

  • That's that's the idea is that the goal is come up with a generator polynomial that is not a multiple of this expression

  • It's a little bit harder, but you know, we can rewrite the error like this

  • We just sort of factoring out an X to the J here

  • And so now we have two factors X to the J is the same as before, right?

  • That's that's X to the I so we're no we're not going to find a multiple of that as long as our generator has at

  • Least two terms and so that just leaves us with with this term over here

  • which we can just rewrite as X to the k plus one where you can think of K is sort of the distance between the

  • Two bits that have errors and it's a little bit hard to come up with polynomials that won't divide into this

  • But there are some simple polynomials that won't divide into this unless K

  • Gets gets really big

  • So for example this polynomial that we've been using here works as long as K is less than you know

  • 32,000 7:51 turns out and

  • So in practice what that means is that this polynomial will detect any two-bit errors

  • As long as the two bits are within this distance from each other

  • Which if your overall message is smaller than this then that's guaranteed to be

  • So if you if you have a message that's less than 32 K

  • Then this particular polynomial will be able to detect any two-bit errors within that message and that's the power of this method, you know

  • We can rigorously mathematically prove that certain patterns of error. We'll always be detected

  • it just might involve little caveats about the message size and it obviously requires a bunch of math, but

  • With that in mind you'll work guaranteed to detect certain patterns of errors

  • And if we know what errors are likely in our inner transmission

  • We can try to find a polynomial that's gonna be best at detecting those errors

  • Now in practice you probably won't come up with your own polynomial

  • there are lots of different ones that have become international standards and

  • You can see a bunch of them here on Wikipedia and I've been using this one called CRC 16 ccitt

  • This X is 16 plus X to the 12 plus X to the fifth plus 1

  • And you can see it's pretty popular to using a whole bunch of different things

  • Bluetooth and you know many other things you may have heard of another really maybe even more popular one is CRC 32

  • Which is you know as the name would suggest a 32-bit polynomial and you might imagine why I haven't been using this as an example

  • Plus division problem would have been real fun with this one, but this is used in all kinds of things including Ethernet. 802 3

  • Standards, so this will include all of your Wi-Fi all kinds of things as well as again many other things PNG things

  • you've probably heard of

  • These are relatively old standards, but they're pretty good and and they're used in everything and so I would recommend just using them

  • But they aren't technically the best you can get, you know

  • Finding good polynomials is actually quite a bit of effort. So it took many years for for people to find better ones

  • For example, you can see here. There's a couple of newer

  • Crc32 variants that are better than the crc32 that everyone uses. In fact, you can see these were discovered by Philip Koopman

  • Who is a professor at Carnegie Mellon and he's done a bunch of research into the best?

  • CRC's and maintains a webpage here with his findings

  • This is what he calls the the best CRC polynomials and he breaks them up into the size of the CRC

  • So we've been looking at 16-bit crcs, but you know, we can go down here and look at 32-bit crcs

  • He represents them in kind of a different format here

  • He represents them in hex, but basically what he's saying here is for 16-bit CRC's

  • What is the best CRC in terms of giving you a certain Hamming distance for a particular size message?

  • If you remember in my last video

  • I talked about Hamming distance and having distance as the minimum number of bits that you'd have to change between two messages in order to

  • Not detect an error

  • So in this case a Hamming distance of four means that you can change any three bits in the message and guaranteed to detect it

  • And he says this particular CRC will give you that and it'll give you that for messages up to 32 K long

  • You can get higher Hamming distances, but you see the message size gets smaller if you use these other CRC's

  • But the neat thing is you go to look at the the 32-bit CRC as you know, some of these are really quite good

  • I mean 32k message

  • you can have a Hamming distance of 6 so guaranteed to catch at least 5 or any 5 errors in a in a

  • 32,000 byte message that's not bad for only having to add 32 bits, you know

  • Just four bytes to your message 0.01% overhead to protect a message like that's not too bad

  • But random one-off single bit errors are not the only type of error that you might want to detect, you know

  • One of the most common errors in data transmission is burst errors

  • And one of the most important properties of CRC is that they're really good at detecting burst errors

  • So what is a burst error? Well, it's a bunch of potentially errored bits here in a row like this

  • And technically the way we define it is

  • It's an error bit followed by some number of bits that may or may not be heard followed by another error bit

  • and then the distance between the first aired bit and that last errored bit is the length of the burst and it's important that the

  • Ones in the middle may or may not be aired

  • So for example, if you just had all ones in here that would still be a burst error, right?

  • Because the first bit is is a one when it shouldn't be the last bit is a one when it shouldn't be in the middle

  • bit, some of them should be one some of them shouldn't

  • But if they were all ones

  • Then that would be a burst here and that's you know an error that could happen in transmission

  • You can have just some glitch that causes nothing but ones to be received

  • Same thing with all zeros, that could be a burst error as well

  • so mathematically the way we look at this is with this expression here, which is you know,

  • this thing with two factors

  • The first is this X to the I and that shows how far from the right the burst error occurs

  • X to the I and then K is the length of the burst

  • so like we saw before if if our generator has more than one term then

  • Then this X to the I is not gonna be a factor. So we need to worry about that

  • We just need to worry about this factor here this polynomial this this K degree color K minus one degree polynomial

  • As long as this K minus one degree polynomial

  • The degree of that polynomial is less than the degree of the power generator polynomial then the remainder can never be zero

  • So let's say K is 16. This is a 16-bit burst, which is which is what it is K minus 1 would be 15

  • So this term here or this factor here, I guess this polynomial here

  • This K minus 1 is going to be a 15th degree polynomial

  • Well, if our generator is a 16th degree polynomial that's not going to divide into that

  • And so it doesn't even matter what our generator as long as it's a 16th degree polynomial

  • It's not gonna divide into that and then it's not gonna divide into this

  • Factor here if it's got more than one term as we saw before

  • so this

  • Polynomial effect pretty much any CRC polynomial is gonna have this property where it's guaranteed to detect burst errors that are smaller than or equal

  • to the size of that polynomial or the degree of that polynomial

  • Some practice any 16-bit crc is always going to protect against 16-bit burst errors

  • A 32-bit CRC is always going to protect against at least 32-bit burst errors and and so forth

  • So now if you take a step back and look at all of this together

  • I hope what you're starting to see is that CRC gives us this really powerful tool for

  • Detecting errors and being able to analyze the types of errors that we're able to detect

  • So we have this tool to be able to model the types of errors

  • We're detecting and and even generalize that and then we have these mathematical tools to be able to evaluate whether a particular generator

  • Polynomial or you know, there's a particular implementation of crc

  • Well detect that type of error or how well it will detect that type of error

  • and it's also happens to be the case that the types of errors that we would detect in a

  • Communication network or something like that are also the types of errors that CRC is able to detect quite well

  • So this is all well and good and everything. But you know, this seems like quite complex

  • You know and and and tedious to have to do all of this

  • Computation and everything to to figure out what that CRC is or to evaluate whether CRC was received correctly

  • if we go back to where this video series started, you know, we're trying to send data from one computer system to another and

  • Evaluate whether we receive that correctly

  • And so when we looked at parity, you know, that was actually quite simple to implement in hardware like this

  • If we look at CRC, this is way more complex

  • You know

  • How are we gonna go about implementing something like this?

  • In hardware or even you know in software, it seems like it might be a bit of work to get this working

  • Well, it turns out and this is one of the coolest things is that in addition to all the mathematical rigor that you get with

  • CRC it turned out to be quite straightforward to implement in hardware and to do all of this

  • You know tedious math that we've seen to do that in hardware quite straightforwardly and so in the next video

  • I'm going to show how we can do all of this math that we just looked at in hardware and

  • Come up with the same answer because it turns out that with just a couple chips. We're able to do all of this math and

  • as you can see the answer we come up with here is

  • The same answer that we that we got when we did all of this complicated

  • Division and this is this is in fact the CRC that we computed for the same message here

  • And so in the next video, we'll go through how to build this hardware and more importantly why it works

  • You

One of the most common error detection techniques used in data communication

字幕と単語

ワンタップで英和辞典検索 単語をクリックすると、意味が表示されます

B1 中級

CRCはどのように機能するのでしょうか? (How do CRCs work?)

  • 32 1
    林宜悉 に公開 2021 年 01 月 14 日
動画の中の単語