* Link Layer
- 물리 계층과 연관이 있다.
> 물리 계층 : 보내는 측은 메세지를 전자기 신호로 변경하여 전달하는 역할(Encoding)을 하고,
받는 측은 전자기 신호를 메세지로 변경하는 역할(Decoding)을 한다.
- Packet을 전달할때 각 Packet의 처음과 끝을 알아야한다.
> 각 node는 packet을 처음과 끝을 알 수 있어야 한다.
> 이는 Link layer의 주 역할이다. 처음과 끝에 경계를 붙여서 전송하는 정보단위를 frame이라고 한다
- Link layer는 Packet의 처음과 끝을 표시하는 역할 뿐만아니라, 에러제어와 흐름제어도 담당한다.
* 경계를 구분하는 방법
- 경계를 구분하는 방법으로는 프래임의 시작과 끝에 특정문자 혹인 Bit patter을 적용한다.
> 이를 Flag byte라고 한다.
- 만약 Flag Byte와 동알한 patter이 data 중간에 발생하면 다음과 같은 2가지 방법으로 해결을 한다.
ⓐ Byte Stuffing
- 만약 flag와 동일한 데이터 정보가 존재하면, 데이터 앞에 escape 문자를 작성해준다.
- 만약 escape문자와 동일한 데이터 정보가 존재하면, 이 앞에도 escape 문자를 작성해준다.
ex)
ⓑ Bit Stuffing
- 만약, flag와 동일한 pattern이 data에 오면, data 중간에 특정 Bit(0or1)를 넣어줘 Flag와 다르게 표시한다.
- 읽을 때는 역으로, 일정 pattern이 올 시 추가된 가짜 bit를 없에는 방식으로 읽는다.
* 흐름제어
- sliding window flow control법을 사용한다.
- ACK이 오기 전에 특정 size만큼 데이터를 지속 보내다가, ACK이 오면 ACK이 온만큼 오른쪽으로 Sliding 시킨다.
ex)
* 에러 제어
- 오류 검출 코드를 생성후 비교한다.
- 에러 종류
ⓐ Single bit error : signal 신호가 감쇠됨에 따라 하나의 bit의 값이 변경 되는 경우
ⓑ burst error : signal 신호가 감쇠됨에 따라 파장을 받아 여러개의 bit값이 변경 되는 경우
※ 대부분의 에러는 연쇠적인 bit 변화인 burst error로 나타나게 된다.
- 에러 검출
> 에러검출 코드를 추가해서 보내준다.
ⓐ 패러티 비트(Parity bit)
: 데이터 bit의 1의 숫자를 세아린후 홀수개면 1, 짝수게면 0을 에러검출 코드로 추가한다.
ex) 1100001 이라는 data가 존재. 1의 개수는 홀수 개이다. 이경우 에러 검출 코드는 1이다.
11000011 마지막 1은 에러 검출 코드이다.
: 홀짝만으로 검사하므로 효용성이 적다. error또한 위에서 설명했듯이 한 bit에서만 발생하는 경우는 거의 없다.
ⓑ 2-dimensional Parity bit
: 하나의 데이터가 아닌 여러개의 data를 2차원으로 bit를 비교한다.
ex)
ⓒ CRC
: 특정 generator로 배타적 나누기한 값을 전송 에러 검출 코드로 추가하여 전달
: 받는 측은 데이터와 에러 검출 코드를 generator로 나눈 결과가 0이면 데이터가 잘 왔다는 것으로 인식
ex)
: Generator는 다항식으로 표현된다.
ex) X^7 + X^5 + X^2 + X + 1 = 010100111(8bit generator)
: Generator를 어떤 것을 쓰느냐는 네트워크의 에러를 잡는 능력에 큰 영향을 끼친다.
: Generator가 길면 길수록 에러 검출을 잘 한다.
하지만, 위에서 봤듯이 generator가 클수록 나머지의 길이가 커진다. 이 나머지는 정보외 코드로 overhead이다.
: 즉, 너무 긴 generator 사용은 오히려 네트워크의 성능을 낮추는 결과를 초래한다.
: CRC는 대부분의 에러를 발견한다.(Uni-binary, tow-binary, odd binary, burst error)
: IP&TCP는 CRC를 사용하지 않는데, 그 이유는 어플리케이션의 효율을 증가 시키기 위해서이다.
( 때로 어떤 어플리케이션은 CRC의 decoding을 실시함으로 치명적인 영향을 끼칠 수 있다.)
: HW적으로 구현이 편하지만, SW적으로 구현이 힘들다.
ⓓ Check Sum
: Message를 16bit단위로 나눈 후 각각을 더한다.
: FFFF 에서 더한 값을 빼준다. 이 값에 마지막 자리수의 carry 값을 더하면, 이 값이 check sum 값이 된다.
: 받는 측은 message를 16bit 단위로 나눈 후 각각을 더하고, check sum값, 마지막 자리의 carry 값까지 더한다.
이 결과가 0이면 안전한 Data이고, 0 이외의 값이 나오면 불안전한 Data로 버린다.
: Application쪽에서 구현하기가 쉽다.
* 에러 정정 코드 전송법(FEC)
- error 검출보다 많은 길이의 overhead가 발생하게 된다.
- 전송효율이 안좋아 사용하지 않는다.
- 이에 따라 error 수정은 재전송으로 해결을 한다.
* 재전송
- 재전송된 데이터를 기다려야 하기 때문에 시간적 지연이 발생할 수 있다.
- real time service는 이러한 지연도 용납되지 않는다.
재전송법을 사용하지 않고, error가 발생한 data는 그냥 버린다. packet error가 많으면 service 질이 낮아진다.
ⓐ stop and wait
- 보낸 것에 대한 Ack이 올때까지 대기하고, Ack이 날라오면 다음 데이터를 전송한다.
ⓑ Go Back N ARQ
- window size만큼 지속적으로 전송을 하다가 error가 판단되면(time out, 순자적으로 ack이 안 날라 올때)
에러가 난 packet부터 다시 보낸다.
- 받는 측은 SEQ번호가 연속적이지 않으면, 그 뒤로 오는 packet은 일단 버린다.
ⓒ Selective Repeat ARQ
- window size만큼 지속적으로 전송을하다가 error가 판된되면, 에러난 packet만 다시 보낸다.
- 받는 측은 일단 Buffer에 에러난 Packet을 저장할 공간을 두고, 이어서 저장을 해둔다.
※ 보내는 측에서는 ⓒ가 효율적이겠지만, Buffer대기 비용 측면에서는 ⓑ가 더 좋다.
※ Piggybacking
> 쌍방향 통신시 Ack을 별도로 전송하지 않고, 보낼 데이터와 함께 packing 하여서 전송을 실시한다.
(Ack과 자신의 Message를 같이 보낸다는 의미)
* Link Layer Protocol
- HDLC
- PPP
ⓐ HDLC
- ISO 표준
- point to point 뿐만 아니라 point to multi-point상에서의 full-duplex와 half-duplex도 지원해준다.
ⓑ PPP(Point to Point Protocol)
- Header 모양