معرفی لیست کدهای SIP Response و آشنایی با آنها، سیپ (SIP) نوعی پروتکل سیگنالینگ است که برای کنترل session های ارتباطات (مانند تماس های VoIP) از آن استفاده میشود. سیپ همانند پروتکل HTTP از تراکنش درخواست/پاسخ (Request/Response Transaction) بهره میگیرد.
هر تراکنش (transaction) شامل یک SIP Request و حداقل یک SIP Response است. درخواست و پاسخ های سیپ میتوانند از طریق عامل کاربر (User Agent) به کلاینت ها (UACs) و سرورها تقسیم شوند.
در این روند کلاینت ها وظیفه پاسخ دهی و سرورها وظیفه دریافت درخواست ها را بر عهده دارند.
یک عامل کاربر میتواند برای تراکنش های مختلف علاوه بر UAC، UAS نیز باشد. در ادامه با بیان یک مثال این مفهوم را بهتر توضیح خواهیم داد.
سیپ فون به عنوان یک عامل کاربری است که در زمان برقراری تماس UAC و در زمان دریافت تماس UAS میباشد. علاوه بر آن، بعضی از سیستم ها میتوانند در یک تراکنش به صورت همزمان UAC و UAS باشند که از آن ها با عنوان عامل کاربر Back-to-Back (B2BUA) نام برده میشود.
پاسخ های سیپ، کد 3 رقمی را ارائه میدهند. این کد 3 رقمی جزئیات Response را شرح میدهد و با توجه به رقم اول خود به عنوان کدهای Provisional، Success، Redirection، Client Error، Server Error و گلوبال failure دسته بندی میشوند. رقم اول این کدها از بین 1 تا 6 میباشد یعنی کد 1XX به عنوان کد Provisional و کد 4XX به عنوان کد کلاینت ارور خواهد بود.
اگر چه در حالت کلی کدهای Response HTTP با کدهای response سیپ سازگاری خوبی دارند اما همهی آن ها در پروتکل سیپ معتبر نیستند.
کدهای SIP response و Reason Phrase های مربوطه، در RFC 3261 تعریف شدهاند. همچنین این RFC رجیستری IANA را به پارامترهای SIP تعریف میکند تا RFC های دیگر بتوانند Response کدهای بیشتری را ارائه دهند.
ما در این مقاله لیست کلیه کدهای Response SIP که در IETF RFC تعریف شدهاند و در رجیستری SIP Parameters IANA به ثبت رسیده اند را گرد آوری کردهایم. علاوه بر آن، این لیست شامل کدهای SIP Response نیز میباشد که در RFC های منسوخ شده (مانند RFC 2543) وجود دارند اما در IANA به ثبت نرسیده اند.
Responses Provisional (1XX)
تلاش برای برقراری تماس (100 Trying)
جستجوی گسترده که انجام میشود ممکن است مدت زمان زیادی طول بکشد، از این رو یک پروکسی Forking باید 100 Trying Response را ارسال نماید.
زنگ زدن (180 Ringing)
User Agent در مقصد INVITE را دریافت کرده و در حال اطلاع دادن به کاربر است.
تماس در حال ارسال است (Call is Being Forwarded 181)
سرورها میتوانند به صورت اختیاری این پاسخ را ارسال کنند تا نشان دهند که تماس ارسال شده است.
در صف انتظار قرار داشتن (182 Queued)
نشان میدهد که مقصد (به طور موقت) در دسترس نبوده است و سرور، تماس را تا زمان دستیابی به مقصد در صف انتظار قرار داده است. یک سرور ممکن است چندین 182 Response را جهت بروزرسانی صف انتظار ارسال نماید.
برقراری تماس (183 Session Progress)
این Response میتواند جهت ارسال اطلاعات اضافی برای تماسی که همچنان برقرار است، استفاده شود.
پایان یافتن تماس (199 Early Dialog Terminated)
User Agent Server (UAS) میتواند از این Response استفاده کند تا به اجزای Upstream SIP (مانند User Agent Client (UAC)) نشان دهد که تماس پایان یافته است.
(2XX) Successful Responses
200 OK: نشان می دهد که request موفقیت آمیز بوده است.
202 Accepted: نشان دهنده آن است که request برای process پذیرفته شده اما تکمیل نشده است.
204 No Notification: نشان می دهد که request موفقیت آمیز بوده است، اما response مربوطه دریافت نمیشود.
(3XX) Redirection Responses
300 Multiple Choices
کاربر یا کلاینت میتواند برای آدرس از چندین گزینه که برای او در قسمت message body یا فیلدهای پیام کانتکت فراهم شده است استفاده نماید. به بیان دیگر، هیچ destination address مشخصی برای remote site وجود ندارد.
301 Moves Permanently
Request-URL اصلی دیگر معتبر نخواهد بود و آدرس جدید در contact header field داده شده است. از این رو، کاربر باید تمامی ریکوردهای اصلی Request-URL را آپدیت نماید. به بیان ساده تر، مشترک مورد نظر در جای دیگر در دسترس میباشد.
302 Moved Temporary
کاربر باید در آدرس contact field تماس بگیرد. اگر فیلد اکسپایر شده باشد، کاربر میتواند result را برای بازه زمانی مشخص ذخیره نماید. به معنی دیگر، مشترک مورد نظر (بطور موقت) در جای دیگر در دسترس میباشد.
305 Use Proxy
کانتکت فیلد پروکسی را نشان میدهد که باید از آن برای دسترسی به مقصد request شده استفاده شود. یعنی، باید از پروکسی مشخصی استفاده شود.
308 Alternative Service
تماس fail شده است، اما میتوان از گزینه های دیگری که در message body قرار دارند استفاده نمود. به بیان ساده تر، تماس ناموفق بوده است، اما از سرویس های جایگزینی که در دسترس هستند میتوان استفاده نمود.
(4XX) Client Failure Reponses
400 Bad Request: request SIP نادرست است.
401 Unauthorized: request نیاز به تأیید اعتبار کاربر دارد. این response توسط UAS ها و registrars ارسال میشود.
402 Payment Required: هنوز تعریف نشده است؛ یعنی برای "اعتبار کافی در دسترس نیست" در نظر گرفته میشود.
403 Forbidden: سرور request را درک میکند، اما از انجام آن امتناع میورزد. در بعضی مواقع اوقات این بدان معنی است که تماس توسط گیرنده (receiver) رد شده است.
404 Not Found: سرور با داشتن اطلاعات دقیق، هیچ کاربری را در دامین مشخص شده و در Request-URI پیدا نمیکند. این وضعیت، در صورتی که دامین Request-URl با هیچ یک از دامین هایی که توسط گیرنده درخواست انجام میشود مطابقت نداشته باشد، باز میگردد.
405 Method Not Allowed: متدی که در Request-Line مشخص شده است قابل درک میباشد، اما برای آدرس مشخص شده توسط Request-URI مجاز نیست. یعنی، Request method (به عنوان مثال SUBSCRIBE یا NOTIFY) مجاز نیست.
406 Not Acceptable: منبعی که توسط request مشخص شده است فقط قادر به تولید واحدهای پاسخگویی میباشد که دارای خصوصیات محتوایی هستند اما مطابق با فیلد accept header ارسال شده در request قابل قبول نخواهند بود. یعنی، گزینه های تماس مجاز نیستند.
407 Proxy Authentication Required: این request توسط پروکسی ارسال میشود و نیاز به تأیید اعتبار کاربر خواهد داشت.
408 Request Timeout: کاربر یافت نمیشود. یعنی سرور نمیتواند response را در مدت زمان مناسب تولید کند. برای مثال، اگر سرور نتواند موقعیت مکانی کاربر را به موقع تعیین کند، کلاینت ممکن است request را بدون تغییر، در هر زمانی تکرار کند.
409 Conflict: کاربر از قبل رجیستر شده است اما به دلیل عدم دسترسی به RFC های بعدی و non-registration در IANA، ممکن است نارضایتی ایجاد شود.
410 Gone: یوزر فقط یک بار وجود داشته است و دیگر در دسترس نیست.
411 Length Required: سرور بدون داشتن یک Content-Length معتبر، درخواست را نمیپذیرد. به دلیل عدم دسترسی به RFC های بعدی و non-registration در IANA، ممکن است نارضایتی ایجاد شود.
412 Conditional Request Failed: پیش شرط داده شده برآورده نشده است.
413 Request Entity Too Large: Request body بیش از حد بزرگ است.
414 Request-URI Too Long: سرور سرویسی را ارائه نمیدهد زیرا Request-URl طولانی تر از آن است که سرور بتواند آن را درک کند.
415 Unsupported Media Type: Request body با این فرمت پشتیبانی نمیشود.
416 Unsupported URI Scheme: Request-URI برای سرور نامفهوم است.
417 Unknown Resource-Priority: آپشن تگ Resource-Priority وجود دارد، اما هیچ Resource-Priority header در دسترس نیست.
420 Bad Extension: پروتکل اکستنشن سیپ اشتباهی استفاده شده است. به همین دلیل، برای سرور نافهوم میباشد.
421 Extension Required: سرور به یک اکستنشن خاص نیاز دارد که در supported header وجود ندارد.
422 Session Interval Too Small: Request دریافت شده شامل یک header Session-Expires با مدت زمان زیر حداقل تایمر است.
423 Interval Too Brief: زمان اکسپایر منابع بیش از حد کوتاه است.
424 Bad Location Information: کانتنت request location نادرست یا نامطلوب است.
428 Use Identity Header: policy سرور به یک Identity header نیاز دارد که یکی از آنها ارائه نشده است.
429 Provide Referrer Identity: سرور در request، توکن Referred-By معتبری را دریافت نکرده است
430 Flow Failed: Flow مشخصی که به سمت user agent بوده fail شده است اما این احتمال وجود دارد که flow های دیگر موفقیت آمیز بوده باشند. این response برای استفاده بین دستگاه های پروکسی در نظر گرفته میشود و نباید با endpoint دیده شود ( اگر توسط endpoint دیده شود، باید به عنوان یک 400 Bad Request response تلقی شود).
433 Anonymity Disallowed: request به دلیل ناشناس بودن رد شده است.
436 Bad Identity-Info: request دارای یک header Identity-Info است و عمل dereference در scheme URI امکان پذیر نخواهد بود.
437 Unsupported Certificate: سرور نمیتواند certificate دامین را، که request را sign نموده است، تایید نماید.
438 Invalid Identity Header: سرور، certificate معتبری را دریافت کرده است تا از آن برای sign request استفاده شود، اما نتوانسته signature را تایید نماید.
439 First Hop Lacks Outbound Support: اولین پروکسی outbound که کاربر در تلاش است تا از طریق آن رجیستر نماید، از ویژگی "outbound" RFC 5626 پشتیبانی نمیکند، اما رجیستر آن را انجام میدهد.
440 Max-Breadth Exceeded: fork های موازی دیگر نمیتوانند از این request استخراج شوند.
469 Bad Info Package: پکیج اینفو نامناسب است و خطای انتقال داده میشود. به همین جهت نیاز هست تا request را دوباره ارسال کنید.
470 Consent Needed: منبع request، اجازه گیرنده را برای انجام چنین request نداشته است.
480 Temporarily Unavailable: گیرنده تماس در حال حاضر در دسترس نیست.
481 Call/Transaction Does Not Exist: سرور request را دریافت کرده است که با هیچ dialog یا تراکنشی مطابقت ندارد.
482 Loop Detected: سرور یک loop را شناسایی کرده است.
483 Too Many Hops: header Max-Forward به میزان حداکثری رسیده است.
484 Address Incomplete: Request-URl ناقص است.
485 Ambiguous: Request-URl مبهم است.
486 Busy Here: گیرنده تماس اشغال است.
487 Request Terminated: Request لغو شده یا خاتمه یافته است.
488 Not Acceptable Here: برخی از جنبه های session description یا Request-URl قابل قبول نیستند.
489 Bad Event: سرور event package مشخص شده در فیلد event header را درک نکرده است.
491 Request Pending: request dialog همچنان درحال پردازش است.
493 Undecipherable: این request شامل یک body رمزگذاری شده MIME است که گیرنده نمی تواند آن را رمزگشایی کند.
494 Security Agreement Required: Request به توافق نامه امنیتی (security agreement)نیاز دارد، اما شامل مکانیزم امنیتی نیست که توسط سرور پشتیبانی شود.
(5XX) Server Failure Responses
500 Internal Server Error: خطای سرور داخلی
501 Not Implemented: سرور از SIP request پشتیبانی نمیکند.
502 Bad Gateway: گیت وی SIP request مشکل دارد.
503 Service Unavailable: service SIP سرور (به طور موقت) در دسترس نیست.
504 Server Time-out: سرور نمیتواند در یک زمان مشخص به سرور دیگری متصل شود.
505 Version Not Supported: ورژن پروتکل SIP توسط سرور پشتیبانی نمیشود.
513 Message Too Large: پیام SIP برای UDP بیش از حد بزرگ است. به همین جهت نیاز هست تا از TCP استفاده شود.
555 Push Notification Service Not Supported: سرور از سرویس push notification ، مشخص شده در پارامتر SIP URI 'pn-provider' ، پشتیبانی نمیکند.
580 Precondition Failure: سرور نمیتواند الزامات پردازش request را برآورده سازد.
(6XX) Global Failure Responses
600 Busy Everywhere: تمام دستگاه های مشترک اشغال هستند.
603 Decline: مشترک مورد نظر تماس را رد میکند.
604 Does Not Exist Anywhere: مشترک مورد نظر وجود ندارد.
606 Not Acceptable: با User Agent با موفقیت تماس گرفته شده است، اما برخی از جنبه های session description مانند رسانه درخواستی (requested media)، پهنای باند یا سبک آدرس دهی قابل قبول نیستند.
607 Unwanted: مشترک مورد نظر خواستار این تماس از طرف تماس گیرنده نبود. تلاش های بعدی برای برقراری تماس احتمالاً به همین صورت رد خواهند شد.
608 Rejected: دستگاه یا فرآیندی که به عنوان واسطه میباشد تماس را رد میکند. این کد با کد 607 (Unwanted) SIP response که در آن مشترک تماس را رد می کند، مغایر است. این response ممکن است شامل اشخاص باشد که تماس را در Call-Info header با اطلاعات موجود در آن مسدود کردند. همچنین به عنوان مکانیزمی در نظر گرفته میشود که تماس گیرندگان میتوانند از طریق آن بفهمند که آیا تماس آن ها مسدود شده است یا خیر.
عیب یابی SIP به صورت real time و از طریق capture tools
Capturing SIP Packets with tcpdump
Display SIP packets with verbose details:
# tcpdump -nqt -s 0 -A -vvv -i eth0 port 5060
Capture SIP packets to disk in PCAP format:
# tcpdump -nq -s 0 -i eth0 -w /tmp/dump.pcap port 5060
Capturing Packets with Tshark
Capture all SIP on specified port
# tshark -nq -i eth0 -w /tmp/sip.pcap port 5060
Extract SIP Server/Client details from INVITEs
# tshark -r sip.pcap "sip.CSeq.method eq INVITE"
Analyze RTP Network Stream Quality by portrange ( Filter on RTCP packets reporting any packet loss or jitter real time )
# tshark -q -f 'udp portrange 16384-32768' -o rtp.heuristic_rtp:TRUE -z rtp,streams
Troubleshooting SIP sessions in the terminal GUI
# sngrep host 172.25.2.116